【C语言】指针超详解版(入门必看!)
目录
初阶指针
一、细说指针
1.指针的概念
2.指针所指向的类型
3.指针的类型
4.指针的值(指针所指向的地址)
5.指针的算数运算
6.指针加减整数的意义(注意:看指针类型)
7.指针加减指针的意义
二、野指针
1.野指针是什么?
2.都有什么情况会造成野指针?
3.如何避免野指针的出现
三、指针和数组
四、二级指针
进阶指针
一、字符指针
二、指针数组
1.指针数组的概念
2.指针数组的使用及注意事项
三、数组指针
1.数组指针的概念
2.数组地址(&arr)和数组首元素地址(arr)区别
四、函数指针
1.函数指针的定义
2.函数指针的示例与拓展
五、函数指针数组
1.函数指针数组定义
2.使用函数指针数组实现计算器功能
六、回调函数
1.回调函数的定义
2.回调函数实现计算器的功能
七、qsort函数
1.qsort函数定义及参数的意义
2.qsort函数排序整型数组示例
3.qsort函数排序结构体示例
总结
初阶指针
一、细说指针
1.指针的概念
指针是一个特殊的变量,里面存储的数值被解释为内存里的一个地址。所以说,指针就是地址,这句话是最直观的。
2.指针所指向的类型
当我们通过指针来访问指针所指向的那块内存时,那块内存的数据类型就决定了指针所指向的类型。
int a=10; (1)int*pa=&a; char ch='c'; (2)char*pc=&ch;
这里我们声明一个整型变量a,这里的指针变量就是pa,pa里存放a的地址,因为a是整形类型,所以我们要在前面加上int,并且pa是指针变量,所以我们还要加上*来表示它是指针。而想要描述指针所指向的类型,我们只需要把定义的指针名字和前面那颗*去掉即可,例如:
(1)int*pa=&a;//指针所指向的类型是int。
(2)char*pc=&c;//指针所指向的类型是char想要找出指针所指向的类型是不是超级简单啊?
3.指针的类型
我们可以先类比下数据类型,在C语言中的数据类型都有哪些?有int ,char等等,那指针类型是否也和这些类型一样呢?答案是:对。那指针类型应该怎么表示呢?
(1)int*pa; (2)char*pb;
我们再来定义两个指针,来看一下指针的类型,这个其实很简单,我们只需要把我们所定义的指针去掉即可,例如:
(1)int*pa;//指针的类型就是int*
(2)char*pb;//指针的类型就是char*
想要找出指针的类型是不是very简单啊?
4.指针的值(指针所指向的地址)
指针我们通常叫做指针变量,因为我们通常用指针来存放一个数据的地址,而这个数据通常是变量,那么指针的值是什么?应该怎么写?这里指针的数值通常与我们编译器的环境相关,在x64环境下,也就是32位环境下,所有的类型的指针的值都是一个32位整数,这32位整数通常以十六进制格式输出(%p进行输出)。
5.指针的算数运算
指针的算数运算通常是+或-一个整数。指针的+或-运算的意义和两个数字的+或-是完全不一样的,我给大家举个例子,例如:
#include int main() { int arr[10] = {1,2,3,4}; int *p = arr; *p = 10; printf("%d\n",*p); p++; *p = 20; printf("%d\n",*p); return 0; }
这里我们定义了一个整型数组arr,我们都知道数组名就是首元素地址,我们上面也说明了地址就是指针,所以我们也可以说数组名也是指针,这里p存放的是1的地址,这里我们解释一下*p:‘*’就是解引用的作用,因为p里存放的是1的地址,我们如果想要找到1,就只需要在p前面加上*即可,这时候就找到1了,然后我们*p=10,就是把1赋值为10,这里数组1的位置就改为了10,然后打印出来,这时候p++,p存放的是1的地址,p++就是2的地址,解引用*p=20,就把2的值改为了20,打印。我们来看一下结果:
这里确实和我们所说的一样,这里的减法也是一样的,我就不和大家过多赘述了,大家可以自己动手尝试一下。
6.指针加减整数的意义(注意:看指针类型)
指针类型的不同决定了指针加减整数所跳过字节数的不同。我给大家举个例子,例如:
从上图中我们可以看出(十六进制数):
int*类型的指针 + 1 是跳过四个字节
double*类型的指针 + 1 是跳过八个字节
char*类型的指针 + 1 是跳过一个字节
聪明的你发现:
int 类型变量的大小刚好是4个字节
double类型变量的大小刚好是8个字节
char类型变量的大小刚好是1个字节
我们的到以下结论:指针±整数对应的是指针向前/向后移动的大小(指针指向变量类型大小 * 整数)
7.指针加减指针的意义
指针加减整数有意义,那指针加减指针呢?哈哈哈,博主在这里给大家设了个陷阱,看哪个小可爱跳进去了呢?我们指针+指针是没有意义的,而指针-指针是有意义的。
指针-指针:指针-指针的结果是两个指针之间所隔的元素个数,这种指针与指针之间的算术运算通常用于计算数组中两个元素之间的距离(所隔的元素个数),这里也一样给大家举个例子:
我们可以看到数组中1和10之间所隔元素(距离)是9。
二、野指针
1.野指针是什么?
野指针是指指向未知内存位置或者已经释放内存的指针。
2.都有什么情况会造成野指针?
引用未初始化的指针、访问已释放内存、数组边界越界等行为都可能导致野指针。
(1)指针未初始化:我们在声明一个指针时一定要初始化,不然就会报错。
//1.指针未初始化 int mian() { int* p;//局部变量指针未初始化,为随机值 *p = 10; return 0; }
(2)指针越界访问:数组有10个元素,但是在for循环中循环了11次,就导致了指针越界访问。
//2.指针越界访问 int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int* p = &arr[0];//int* p = arr;数组名就是数组首元素地址 int sz = sizeof(arr) / sizeof(arr[0]); int i = 0; for (i = 0; i 来指向要排序结构体的哪个成员信息,而字符串比较大小不是比较长度,而是比较对应字符的ASCALL值大,这里比较字符串就要用到strcmp操作符,它是怎么用的呢?strcmp(字符串,字符串)==0 //代表两个字符串相等
总结
总的来说指针基本上就这些内容了,大家可以反复观看,如果有什么不懂的地方欢迎大家在评论区留言,博主看到都会回复的,大家如果看到评论区的问题也可以相互帮助解答一下,最后,博客制作不易,请大家动动发财的小手给博主点个赞,你们的认可是我最大的动力,最后祝大家在C语言这门课程中进步,希望大家可以和我一起进步!!!我们共同进步!!! 如果这篇文章对你有用的话,希望大家给我一个三连支持一下叭[玫瑰]