【C语言】指针超详细讲解(超级详细!!!快来看快来看!!!)
目录
- 初阶指针
- 一、指针的概念
- 二、指针和指针类型
- 1. 为什么指针有多种类型??
- 2. 指针+-整数的意义是什么??
- 3. 指针+-指针有什么意义??
- 4. 得到了变量的地址有什么用呢??(指针解引用)
- 三、野指针
- 1. 野指针是什么??
- 2. 什么情况会造成野指针??
- 3. 如何能够防止野指针的出现??
- 四、指针和数组
- 五、二级指针
- 进阶指针
- 一、字符指针
- 二、指针数组
- 1. 指针数组的定义
- 2. 指针数组的使用
- 三、数组指针
- 1. 如何定义数组指针??
- 2. 数组的地址和数组首元素的地址的区别
- 四、函数指针
- 1. 函数指针的定义
- 2. &(函数名) vs(函数名)
- 五、函数指针数组
- 1. 函数指针数组的定义
- 2. 函数指针数组的使用
- 六、指向函数指针数组的指针
- 函数指针数组的指针的定义
- 七、回调函数
- 1. 回调函数的定义
- 2. 回调函数的使用
- ���尾
初阶指针
一、指针的概念
- 指针??是??
- 指针是内存中一个最小单元的编号,也就是地址
- 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
所以说:指针就是地址,人们口中的指针变量也是指针。
- 指针变量??是??
我们可以通过&(取地址操作符)取出变量的内存与实地址,把地址可以存放到一个变量中,这个变量就是指针变量。
int main() { int c = 520; //将520赋给c int* ch = &c; //将整形c的地址取出来放在ch中 printf("%p", ch); return 0; }
- 指针变量的大小??是??
指针的大小在32位平台是4个字节,在64位平台是8个字节。
二、指针和指针类型
1. 为什么指针有多种类型??
- 变量有多种类型,那么指针也会也有多种类型吧??
是的,不同类型的变量的地址就应该放在对应的指针变量中。
int main() { int a = 0; int* pa = &a; double b = 0; double* pb = &pb; char c = 'w'; char* pc = &c; return 0; }
2. 指针±整数的意义是什么??
- 明明都是地址,为什么要区分是什么类型的呢??
那是因为不同类型的指针±整数所跳过的字节数不同。
int main() { int a = 0; int* pa = &a; printf("%p %p\n", pa, pa + 1); double b = 0; double* pb = &pb; printf("%p %p\n", pb, pb + 1); char c = 'w'; char* pc = &c; printf("%p %p\n", pc, pc + 1); return 0; }
从上图中我们可以看出:
int*类型的指针 + 1 是跳过四个字节
double*类型的指针 + 1 是跳过八个字节
char*类型的指针 + 1 是跳过一个字节
诶,看着很眼熟??
int 类型变量的大小是 四个字节?
double类型变量的大小是八个字节?
char类型变量的大小是一个字节?
难道?难道?没错!!!就是你猜想的那样…
指针±整数对应的是指针向前/向后移动的大小(指针指向变量类型大小 * 整数)
3. 指针±指针有什么意义??
- 指针加整数有意义,那么指针 + - 指针呢??也有意义吗??
你猜对了!!一半 !!
指针 + 指针是没有意义的,但是指针 - 指针是有意义的哟!!
指针 - 指针的结果是两个指针之间所隔的元素个数,这种操作通常用于计算数组中两个元素之间的距离。
4. 得到了变量的地址有什么用呢??(指针解引用)
指针的作用就是通过地址取访问指针指向的变量。
指针的类型决定了指针解引用能够访问的字节数。
例如上面的int*类型的指针,解引用能访问四个字节,double*类型的指针可以访问八个字节,char*类型的指针能够访问一个字节
三、野指针
1. 野指针是什么??
野指针是指指向未知内存位置或者已经释放内存的指针。
2. 什么情况会造成野指针??
引用未初始化的指针、访问已释放内存、数组边界越界等行为都可能导致野指针。
- 解引用未初始化的指针
int main() { int* pa = NULL; printf("%d", *pa); return 0; }
- 数组的越界访问
int main() { char ch[4] = "Love"; for (int i = 0; i printf("%c ", ch[i]); } return 0; } //动态申请4个char类型大小的空间 char* ch = (char*)malloc(sizeof(char) * 4); if (ch == NULL) { return 0; } for (int i = 0; i
- 数组的越界访问
- 解引用未初始化的指针
- 指针加整数有意义,那么指针 + - 指针呢??也有意义吗??
- 明明都是地址,为什么要区分是什么类型的呢??
- 变量有多种类型,那么指针也会也有多种类型吧??
- 指针变量的大小??是??
- 指针??是??
The End