C数组指针
定义
今天看c陷阱与缺陷,发现这个数组指针挺有意思的。
首先定义一个数组指针:int (*p)[4]
。程序如下:
|
通过p=calendar
,这样p
就指向了calendar
第一个元素,也就是calendar
的3个有着4个元素的元素的第一个元素。
例子
这里通过一系列的小例子去实验说明p
的用法。
例子1
printf("%d\n",calendar[2][2]);
printf("%d\n",*(*(calendar+2)+2));
printf("%d\n",*(*(p+2)+2));输出
这个例子还是挺好理解的,11
11
11p=calendar
那么他们的地址相同,用法相同即可寻找到对应的元素。 当然要注意一点*(calendar+2)
这样才能指向二维数组的第3行。例子2
printf("%d\n",calendar[2][2]);
printf("%d\n",*(*calendar+10));
printf("%d\n",*(*p+10));输出
11
11
11printf("%p\n",p);
printf("%p\n",calendar);
printf("%p\n",*p);
printf("%p\n",*calendar);输出
这里要注意虽然他们的指向的地址是一样的,但是只能使用0x7ffdcddf8480
0x7ffdcddf8480
0x7ffdcddf8480
0x7ffdcddf8480*(*p+10)
这样的形式,*(p+10)
这个形式是不被允许的。 这个应该是由于c语言中对于&calendar==calendar
的定义,虽然编译器会提示warning,但是其返回值是成立的。例子3
printf("%d\n",(**p+10));
printf("%d\n",**p);
printf("%d\n",calendar[0][0]);输出
这个11
1
1**p
指向的就是二维数组第一个元素的值。