1 字符指针变量
char* p = 'abcdef' 这里的赋值是将字符串首元素的地址赋值给p(常量字符串地址不能被改变)
当⼏个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存。但是⽤相同的常量字符串去初始 化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。内容相同的常量字符串只存放一份地址
2 数组指针变量(与指针数组不同)
其实就是 数组指针--指向数组的指针--数组指针变量中存放数组的地址
arr--int* arr+1跳过4个字节
&arr--int(*)[10] &arr+1 跳过40个字节
指针数组
1 是数组 是存放指针指针的数组 char* arr[5]
数组指针 1指针 指向数组 int (*p)[10];
二维数组传参
⼆维数组传参本质上也是传递了地址,传递的是第⼀ ⾏这个⼀维数组的地址
arr[i] == *(arr+i)
arr[i][j] == (*(arr+i))[j]
不管是一维数组还是二维数组传参
形参可以写成数组,也可以写成指针 都要对数组名深入理解
函数指针变量
即存放函数的地址(函数也有地址)
arr和&arr有区别 但是Add和&Add没有区别都是函数的地址
如
且pf == Add,即Add(3,4)=pf(3, 4)==(*pf)(4,5)
两个有趣的代码
同时那个*也可以不写
另一个
函数定义
函数调用 Add(3,4);
函数声明 int Add(int ,int);
语法上不能如红色字体写
typedef关键字
typedef是⽤来类型重命名的,可以将复杂的类型,简单化。
指针类型也可以用
接下来简化第二个
函数指针数组
如int* arr1[10] 为整形指针数组
char* arr2[10] 为字符指针数组
那么每个元素为函数的地址 就叫做函数指针数组
如
这样使用
函数指针数组的用法:转移表
能够改进