超人气网站是这样建成的,汕头正规网站建设模板总部,网站优化如何做pc指数,肥城移动网站制作文章目录 1.字符指针变量常见的字符指针初始化另一种字符指针初始化例#xff1a; 2.数组指针变量什么是数组指针变量数组指针变量创建数组指针变量初始化例#xff08;二维数组传参的本质#xff09; 3.函数指针变量什么是函数指针变量呢#xff1f;函数指针变量创建函数指… 文章目录 1.字符指针变量常见的字符指针初始化另一种字符指针初始化例 2.数组指针变量什么是数组指针变量数组指针变量创建数组指针变量初始化例二维数组传参的本质 3.函数指针变量什么是函数指针变量呢函数指针变量创建函数指针使用typedef关键字 4.函数指针数组概念创建通过函数指针数组实现计算器 1.字符指针变量
常见的字符指针初始化 字符指针 char * 常见的初始化
int main() {char a w;char* p a;return 0;
}跟 int *类型的初始化一样下面介绍另一种字符指针的初始化
另一种字符指针初始化 这种是将一个字符串直接赋给字符指针变量 如
char* p abcdefg;那么它能不能像一般的字符数组那样直接打印出来呢我们通过代码看看
int main() {char a[] abcdefg;char* p abcdefg;printf(%s, a);//打印字符数组printf(%s, *p);//打印指针初始化出来的字符串return 0;
}运行结果
由结果看出只有字符数组打印出来了而字符指针没打印出来这是为什么呢 其实是因为这样初始化只是把字符串的首个字符的地址传给字符指针变量 p 这样的话 *pa。 在这里%s是打印字符串的所以打印不了一个字符。
那我们用打印一个字符的 %c 试试
int main() {char a[] abcdefg;char* p abcdefg;printf(%s\n, a);printf(%c, *p);return 0;
}运行结果 字符指针只打印一个首字符验证了首个字符的地址传给字符指针变量 p
那么我们可以用循环的方式将这个字符串打印出来
int main() {char* p abcdefg;int s strlen(p);//求字符长度
for(int i0;is;i)printf(%c, *(pi));//将字符一一打印出来return 0;
}运行结果
例
这是《剑指offer》中⼀道和字符串相关的笔试题问最后输出的结果是什么 代码
#include stdio.h
int main()
{char str1[] hello bit.;char str2[] hello bit.;const char *str3 hello bit.;const char *str4 hello bit.;if(str1 str2)printf(str1 and str2 are same\n);elseprintf(str1 and str2 are not same\n);if(str3 str4)printf(str3 and str4 are same\n);elseprintf(str3 and str4 are not same\n);return 0;}答案
分析 1.这道题其实就是比较首地址 2这⾥str3和str4指向的是⼀个同⼀个常量字符串。C/C会把常量字符串存储到单独的⼀个内存区域当⼏个指针指向同⼀个字符串的时候他们实际会指向同⼀块内存。但是⽤相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同str3和str4相同。
2.数组指针变量 数组指针是指针不是数组 什么是数组指针变量
我们通过其他类型的指针进行类比一下 整形指针变量 int * pint; 存放的是整形变量的地址能够指向整形数据的指针。 浮点型指针变量 float * pf; 存放浮点型变量的地址能够指向浮点型数据的指针。 那么数组指针变量就是存放数组地址指向数组的指针变量吧
数组指针变量创建
创建int (*p)[10] 解释p先和*结合说明p是⼀个指针变量变量然后指着指向的是⼀个⼤⼩为10个整型的数组。所以p是⼀个指针指向⼀个数组叫数组指针。 注意[ ]的优先级要⾼于 * 号的所以必须加上来保证p先和 * 结合。
数组指针变量初始化
数组指针是用来存放数组的指针的那么我们将数组取地址在赋给数组指针变量即可 如
int arr[10] { 1,2,3,4,5,7,8,9,0.6 };
int(*p)[10] arr;解释 图解一维数组
例二维数组传参的本质 在数组里面的二维数组可以看成一个一维数组只不过是每个元素就是一个数组而已所以根据数组名是数组⾸元素的地址这个规则⼆维数组的数组名表⽰的就是第⼀⾏的地址是⼀维数组的地址。 1.通过二维数组接收参数 这是一般的方法
void qin(int arr[2][5] ){for (int i 0; i 2; i) {for (int j 0; j 5; j)printf(%d , arr[i][j]);}printf(\n);
}
int main() {int arr[2][5] { 1,2,3,4,5,6,7,8,9,0 };qin(arr);return 0;
}2.通过数组指针来了解二维数组的本质
void qin(int(*p)[5]) {//*(p1)arr[0]jfor (int i 0; i 2; i) {for (int j 0; j 5; j)printf(%d , (*(p i))[j]);// //*p*pi,当i 加1时相当于跳过二维数组中的一个一维数组//当然跟据前面的知识也可以写成这样 *(*(pi)j)
}printf(\n);
}
int main() {int arr[2][5] { 1,2,3,4,5,6,7,8,9,0 };qin(arr);//在前面指针内容里说过数组名就是首元素的地址//那么我们这里把二维数组当成一维数组那么首元素不就是一整个一维数组的地址吗return 0;
}图解 总结⼆维数组传参形参的部分可以写成数组也可以写成指针形式。
3.函数指针变量
什么是函数指针变量呢
数组指针是用来存数组的地址的那么函数指针呢 其实函数指针也是用来存地址的存的是函数的地址这里就有很多人有疑问了函数有地址 那么我们来做个测试
int add(int x, int y) {return x y;
}
int main() {printf(%p, add);return 0;
}运行结果 很明显函数是有地址的 这里还有一个注意的是函数名和函数名都是代表函数的地址如addadd 我们来测试一下吧
int add(int x, int y) {return x y;
}
int main() {printf(add%p\n, add);printf(add%p, add);return 0;
}运行结果 耶是一样的
函数指针变量创建
创建int (*p) (int, int)
函数指针使用
我们用函数指针来实现一下加法
int add(int x, int y) {return x y;
}
int main() {int (*p)(int, int) add;int a 3, b 9;printf(%d\n, p(a, b));//这里不用 * 也可以因为函数调用的时候本身就是用地址去调用printf(%d\n, (*p)(a, b));return 0;
}运行结果
typedef关键字 typedef 是⽤来类型重命名的可以将复杂的类型简单化。 如
typedef unsigned int uint;
//将unsigned int 重命名为uint那么如何来重命名指针类型呢
typedef int(*)(int ,int) te //错误
typedef int(*te)(int, int) //正确命名将重命名放到原来放函数指针名称的位置
typedef (*te)[10]//数组指针重命名4.函数指针数组
概念 把函数的地址存到⼀个数组中那这个数组就叫函数指针数组就是将函数指针放到一个数字里 创建
int (*) (intint)//函数指针类型
int (*p[10])(int ,int)//函数指针数组--p先和[]结合形成数组再和函数指针类型结合形成函数指针数组通过函数指针数组实现计算器 我们这里要实现一个简单的计算器分别有加法、减法、乘法、除法那么我们就要实现四个函数来实现然后还要一个选择来选择实行什么计算最后还需要一个菜单就完成了 我们先用一般的方法来实现计算器:
#include stdio.h
int add(int a, int b)//加法
{return a b;
}
int sub(int a, int b)//减法
{return a - b;
}
int mul(int a, int b)//乘法
{return a * b;
}
int div(int a, int b)//除法
{return a / b;
}
int main()
{int x, y;int input 1;int ret 0;do//菜单{printf(*************************\n);printf( 1:add 2:sub \n);printf( 3:mul 4:div \n);printf( 0:exit \n);printf(*************************\n);printf(请选择);scanf(%d, input);switch (input){case 1://选择printf(输⼊操作数);scanf(%d %d, x, y);ret add(x, y);printf(ret %d\n, ret);break;case 2:printf(输⼊操作数);scanf(%d %d, x, y);ret sub(x, y);printf(ret %d\n, ret);break;case 3:printf(输⼊操作数);scanf(%d %d, x, y);ret mul(x, y);printf(ret %d\n, ret);break;case 4:printf(输⼊操作数);scanf(%d %d, x, y);ret div(x, y);printf(ret %d\n, ret);break;case 0:printf(退出程序\n);break;default:printf(选择错误\n);break;}} while (input);return 0;
}使⽤函数指针数组的实现 我们将这4个函数都放到一个函数指针数组里当我们需要实行什么计算就通过什么下标来访问这个函数 #include stdio.h
int add(int a, int b)
{return a b;
}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a*b;
}
int div(int a, int b)
{return a / b;
}
int main()
{int x, y;int input 1;int ret 0;int(*p[5])(int x, int y) { 0, add, sub, mul, div }; //储存函数地址这里的0也算一个地址我们这样是方便选择do{printf(*************************\n);printf( 1:add 2:sub \n);printf( 3:mul 4:div \n);printf( 0:exit \n);printf(*************************\n);printf( 请选择 );scanf(%d, input);//输入下标if ((input 4 input 1)){printf( 输⼊操作数 );scanf( %d %d, x, y);ret (*p[input])(x, y);printf( ret %d\n, ret);}else if(input 0){printf(退出计算器\n);}else{printf( 输⼊有误\n ); }以上就是我的分享 谢谢大家的观看