C语言 多维指针注意问题

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

你可能感兴趣的:(C语言 多维指针注意问题)