不要把多级指针和指向数组的指针定义混淆:
char **p1;
char (*p2)[5];
char *p3 [5];
p1是二级指针,p2、p3级别等效为二级指针。
void main()
{
char **p1;
char a[10][5];
char(*p2)[5] = a;
p1 = a; //C语言(后缀名是.C的文件)中可以这样写,C++(后缀名是.cpp的文件)中这样写会报错
//查看a,p1+1和p2+1
printf("%0x,%0x,%0x",a,p+1,p2+1);
}
可以看出,p+1比a偏移了4个字节的地址,p+2比a偏移了5个字节的地址。
实验证明:可以让一个指向一维数组的指针去模拟二维数组的行为,把二维数组看成由大元素构成的一维数组。
指向一维数组的指针和普通二维数组可以在一起使用。
二维指针**p1可以看做元素是指针的一维指针数组*(*p),p1+1则偏移一个指针元素*p的大小,而指针是占4字节大小的地址,所以p1+1偏移了4个字节。
以下变量的含义以及偏移“1”走的距离:
int a[4][5]; //a+1?
int (*p1)[5]; //p1+1?
int **p2; //p2+1?
int *p3[5]; //p3+1?
可以让指针p1获得数组a的首地址,进而访问二维数组的各个元素,
可以让p2获得指针数组p3的首地址,进而访问指针数组各个元素
int *a[10];
//定义了一个一维指针数组,特殊在每个元素都是指针。
int **p = a;
a+1和p+1的结果是相同的。
结论:可让一个二级指针指向一维指针数组。
二级指针和一维指针数组可以在一起使用,效果等同。
可以让一个一级指针(*p)[N]指向一个二维数组a[M][N]。
一级指针(*p)[N]和二维数组a[M][N]可以在一起使用,效果等同。
定义指针数组的时候可以:
char* color[] = {"red","yellow","blue","green"};
指针数组color自动识别初始化时的元素个数(有几个逗号相隔),此题中color数组的大小为4,并接收每一元素的首地址(因为元素是字符串常量,所以接收的都是代码区地址).