不要把多级指针和指向数组的指针定义混淆: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,并接收每一元素的首地址(因为元素是字符串常量,所以接收的都是代码区地址).