这篇文章可能会有点绕,需要多加思考,理解他们之间的层次关系。
一、指针数组与数组指针
指针数组
指针数组是由指针变量组成的数组,它的成员是指针变量
int* arr1[10];
int *arr2[10];
以上两种写法都表示长度为10的指针数组。
数组指针
数组指针是专门指向数组的指针变量
int (*arr)[10];
因为是指向数组的指针,所以星号需要和数组在一起,加个括号可以优先级。
注意:指针数组和数组指针看上去很像,事实上只需要看后两个字就能明白它们的性质。指针数组是数组,用来装指针的数组,而数组指针是指针,用来指向数组的指针
指针与数组名:
数组名可以看做一种特殊的指针,但是它不能修改它指向的地址,等同于常量。
因为数组名与内存之间是映射关系,数组名是没有自己的存储空间的,所以不能修改地址指向。而指针变量与内存之间是指向关系,可以修改指向来指向不同的内存空间。
int arr[10];
arr == &arr == &arr[0]
注意:它们只是地址相同,类型还是不同的。arr和&arr[0]是int*类型的指针变量,&arr是int (*arr)[10]的数组指针变量。
数组名可以当做指针来使用,并且如果指针变量中存储的是数组的首地址,此时指针也可以当做数组使用。
数组名[i] == *(数组名+i)
*(p+i) == p[i];
注意:数组作为函数的参数时长度丢失的原因是因为蜕变成了指针
二、二级指针
二级指针就是指向指针的指针,里面存储的是指针变量的地址
定义: 类型** 变量名;
赋值: 变量名 = &指针变量;
解引用: *二级指针变量 == 指针变量
**二级指针变量== *指针 == 普通变量
三、函数指针(多用于回调函数)
函数名就是该函数在代码段中的内存首地址,调用函数其实就是通过内存首地址跳转到该函数所在的代码段中去执行二进制程序。
函数指针就是用来专门指向函数的指针,里面存储的是函数的首地址,对函数指针解引用相当于执行函数。
函数名和函数指针的区别
函数名不能修改指向,函数指针可以修改指向。因为函数名与内存之间是映射关系,而函数指针与内存之间是指向关系。
定义函数指针(函数指针定义后可以当做函数来用)
返回值 (*指针变量名)(类型1,类型2,…);
赋值:
指针变量名 = 函数名;
通过函数指针调用函数
和函数用法一样: 指针变量名(实参);
回调:
通过函数指针(函数名),把函数当做参数一样传递给另一个函数使用。
结语
希望这篇文章对你有所帮助