一、字符指针变量
这里str3和str4指向的是同一个常量字符串。C/C++会把常量字符串单独存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以strI和str2不同,str3和str4相同。
相同的常量字符串,没必要保存2份,因为常量字符串不能被修改。(str1和str2保存首元素地址)
二、数组指针变量
1、数组指针变量
数组指针变量是指针变量。
数组指针变量存放的是数组的地址,能够指向数组的指针变量。
int *p1[10];------->p1先和[ ]结合,([ ]的优先级高于*),所以p1是指针数组,存放指针的数组
int (*p2)[10];------->*和p2先结合,所以p2是指针变量,指向的是数组,p2是一个指针,指向一个数组,叫数组指针。
2、数组指针变量初始化
要存放一个数组的地址,就得存放在数组指针变量中。
实例:int (*p) [ 10] = &arr;
int是p指向的数组的元素类型,p是数组指针变量名,[10]是p指向数组的元素个数。
三、二维数组传参的本质
二维数组可以看成每个元素是一维数组的数组,也就是二维数组的每个元素是一个一维数组,那么二位数组的首元素就是第一行,所以得出二维数组的数组名表示的是第一行的地址,那么意味着二维数组传参本质上是传递了地址,传递的是第一行这个一维数组的地址。
四、函数指针变量
1、函数指针变量的创建
在学习数组指针时,我们知道数组名是首元素的地址,&数组名是数组的地址。那么函数指针呢?
函数指针变量应该是存放函数地址的,未来能通过地址调用函数
可以看到函数确实有地址,函数名就是函数的地址,也·可以通过&函数名的方式获得函数的地址。
下面是函数指针变量的创建举例:
int (*pf1) (int x, int y) // int是pf1指向函数的返回类型,(int x,int y)中x,y可以省略
int (*) (int x, int y) // 这是pf1函数指针变量的类型
辨析:
void(*)( )——》函数指针类型
(void(*)( ))——》强制类型转换
(void(*)( ) 0——》将0强制类型转换为void(*)( )的函数指针类型。
2、typedef关键字
typedef是用来类型重命名的,可以将复杂的类型简单化。
例如重命名unsigned int:
typedef unsinged int uint; 这样unsigned int 便可以写为uint
重命名指针类型:
typedef int*ptr_t;
重命名数组指针(int(*)[5]):
typedef int (*parr_t)[5];
重命名函数指针:
typedef void (*pfun_t)(int);
五、函数指针数组
把函数的地址放到一个数组中,这个数组就是函数指针数组。
函数指针数组定义:
int ( * parr1[5] )( );
parr1先和[ ]结合,说明是数组,数组的内容是int (*)( )类型的函数指针。
六、函数指针数组运用
函数指针数组的用途:转移表
下面实现简单计算器: