php 企业网站管理系统,微信网站与响应式网站,wordpress上传服务器域名,商务网站建设作业#x1f4dd;前言#xff1a; 上篇文章C语言——指针#xff08;三#xff09;对指针和数组进行了讲解#xff0c;今天主要更深入的讲解一下不同类型指针变量的特点#xff1a; 1#xff0c;字符指针变量 2#xff0c;数组指针变量 3#xff0c;函数指针变量 #x1…前言 上篇文章C语言——指针三对指针和数组进行了讲解今天主要更深入的讲解一下不同类型指针变量的特点 1字符指针变量 2数组指针变量 3函数指针变量 个人简介努力学习ing 个人专栏C语言入门基础 CSDN主页 愚润求学 每日鸡汤想去的地方敲两次门又何妨 文章目录 一字符指针变量char*1一般使用2储存字符串3面试题 二数组指针变量1识别数组指针2数组指针的初始化3二维数组传参的本质 三函数指针变量1函数的地址2创建函数指针3函数指针的使用 一字符指针变量char*
1一般使用 int main
{char ch a;char *pc ch; //把ch的地址赋值给pc*pc a; //把‘a’赋值给pc所指向的空间return 0
}2储存字符串
那么字符串又该如何用字符指针来储存呢 请看下面的代码
int main()
{const char* pc hello bit;printf(%s\n, pc);return 0;
}对于第一行代码const char* pc “hello bit”; 难道这里是把整个字符串储存到pc指针变量里了吗 答案是错误 真正存入pc指针变量的是“hello bit”的第一个字符‘h’的地址 这是因为 当常量字符串出现在表达式中的时候它的值是第一个字符的地址 我们都知道数组中**首地址[下标]**的形式可以实现对元素的查找其实字符串也可以用同样的形式来查找字符串中的内容。 因为字符串在内存中也是连续储存的所以我们可以把字符串理解成一个内容不能被修改的字符数组 并且**表达式中的整个字符串的值是第一个字符的地址** 我们可以验证一下 就如上面图片所展示的以pc为首地址找到了下标为0的字符‘h’和下标为3的字符‘l’
3面试题
下面有一道典型的题目可以加深我们的理解 请看下面这段代码思考输出结果
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这里的str1和str2是两个不同的字符数组但是存放的内容都是“hello bit.” 2str3和str4是两个字符变量表达式中的“hello bit”的值是首字符的地址所以str3和str4中存放的都是‘h’的地址 对表达式的意义进行理解 1**if(str1 str2)**中str1代表的是str1数组中首元素的地址str2代表的是str2数组中首元素的地址所以这个表达式比较的是两个数组首元素的地址是否相同 2**if(str3 str4)**中因为str3和str4都是字符指针是两个变量所以这个表达式比较的是两个变量里面的值是否相同 虽然str1与str2两个字符数组的内容相同但是两个字符数组所占用的内存是不同的所以两个数组的首元素的地址也不同所以str1!str2 对于str3和str4而言两个变量储存的都是同一份“hello bit”中’h’的地址所以两个变量的内容是相同的即str3str4 二数组指针变量
1识别数组指针
数组指针变量就是用来存放数组的地址能够指向数组的指针变量 我们来看下面哪个是数组指针注意看类型 int *p1[10]; int (*p2)[10] 答案 p1是数组里有十个元素每个元素的类型是int*的指针数组 p2是指向数组这个数组有十个元素每个元素的类型是int的数组指针 解释 在这里我们要注意符号结合的优先级[]的优先级高于*号 1p1先与[10]结合→构成一个有10个元素的数组数组的类型为int* 2p2在的限制下先与*号结合构成指针指向的是有十个元素的数组数组的类型是int 下图是数组指针类型的解析
2数组指针的初始化
和其他类型的变量初始化相似只需给变量赋一个符合类型的值就行了 例如我们用来得到数组的地址然后再赋值给数组指针
int arr[10] {0};
int(*p)[10] arr;
//这样我们就通过arr得到了数组的地址然后复制给了p指针变量3二维数组传参的本质
趁热打铁学习了数组指针我们再来看看与其有关的二维数组的传参本质 我们都知道 1二维数组可以看成每个元素是一维数组的数组那么→二维数组的每一行其实就是一个元素且这个元素是一维数组 2数组名是数组首元素的地址那么→二维数组的数组名也就是二维数组的第一行这个一维数组的地址 从上面我们可以推断 二维数组传参的本质是传递这个二维数组的第一行这个一维数组的地址 所以二维数组传参的时候也可以用数组指针的形式来书写 void test(int arr[3][5]) void test(int (p)[5]) //这个变量p就是数组指针存放的是这个二维数组里第一行一维数组的地址类型是int()[5] 三函数指针变量
函数指针变量就是用来存放函数的地址的指针变量 有了函数的地址以后我们就可以通过地址来调用函数
1函数的地址
函数有没有地址函数的地址又该怎么拿到呢 我们做个测试 我们发现1函数也是有地址的可以用 函数名 来获得2函数名表示的是函数的地址
2创建函数指针
函数指针的写法与数组指针类似下面进行函数指针创建的展示
void test()
{printf(“天天开心”);
}
void(*pf1)() test; //pf1存放的就是test函数的地址
int Add(int x, int y)
{return xy;
}
int (*pf3)(int, int ) Add; //pf3存放的就是Add函数的地址
(或者) int (*pf3)(int x, int y ) Add;函数指针类型解析
3函数指针的使用
通过函数指针调用指针指向的函数
int main()
{int(*pf3)(int, int) Add;printf(%d\n, (*pf3)(2, 3));printf(%d\n, pf3(2, 3));return 0;
}输出结果 5 8 我的分享也就到此结束啦 要是我的分享也能对你的学习起到帮助那简直是太酷啦 若有不足还请大家多多指正我们一起学习交流 公主王子点赞→收藏⭐→关注 感谢大家的观看和支持祝大家都能得偿所愿天天开心