c语言指针和数组

#include<stdio.h>
main()
{ int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p=a[0];
p+=6;
printf("%d ",*p); /* ① */
printf("%d ",*(*(a+6))); /* ② */
//printf("%d ",*(a[1]+=2)); /* ③ */
printf("%d",*(&a[0][0]+6));/* ④ */
}
能不能具体说说printf("%d ",*(*(a+6))); 是什麽意思,输出结果是1245152

这个可不是老师故意为难的,而是作为IT一员所必须理解的.
对于编译器来说,"[]"是个优先级很高的单目运算符,它是这样解析这运算符的:
array[m1][m2][m3][m4]...[mn]=*(*(*(*(*(array+m1))+m2)+m3)+m4)+...+mn);(n>=1)

这里来讨论简单点的咯,就取n=2时吧,此时有: array[m1][m2]=*(*(array+m1)+m2);
要透彻理解这表达式,得先弄清楚指针的加法是怎样的.
指针p=指针q+n(n为整数,p,q为同类型指针),意思即:指针p指向了指针q所指向内存处的后n*q所指向的单位的大小.

举个例子吧:
int array[4][6];
array是个二维数组,由4个一维数组array[0],array[1],array[2],array[3]组成.array也是个二维常量指针,它指向array[0].所以,对于(array+2)这个指针,它是指向array所指向内存地址处的后(2*sizeof(array[0])),即(12*sizeof(int))个字节处.(即array+2指向array[2]). 而array[2]这个一维指针则指向array[2][0]

而(*array)(即array[0])便为一维指针了,它指向array[0][0],所以,对于(*(array+2)+3)这个指针,由于array+2指向array[2],所以*(array+2)指向array[2][0].所以(*(array+2)+3)便是指向(*(array+2))所指向内存处的后(3*sizeof(array[2][0])),即(3*sizeof(int))个字节处.(即(*(array+2)+3)指向array[2][3]).

所以,便有了array[2][3]=*(*(array+2)+3). 2代表指针要后移2*sizeof(array[0])个字节,3代表指针要移动3*sizeof(array[2][0])个字节.所以,指针一共要移动多少也就清楚了.

因为不知道你学得怎样,所以讲的有些啰嗦呃,但尽量清楚些....

再举个典型例子:
int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n", array[1][7]);
这该输出多少呢?还是越界错误?
解答:array[1][7]被编译器解析为:*(*(array+1)+7),后移的总字节为1*sizeof(array[1])+7*sizeof(array[1][0]),即11*sizeof(int). 而该数组大小为12*sizeof(int),array指针是可以后移11*sizeof(int)个字节的,所以不会越界.所以,(*(array+1)+7)这个指针指向了该数组第12个单位(第一个单位为a[0][0]),即array[2][3],即12,所以程序输出12.
也可以这样快速看出array[1][7]值为什么:arra[1]指向array[1][0],是数组的第5个元素.7表示让array[1]这个指针再后移7个单位.所以array[1][7]便是该数组的第12个单位也即array[2][3]了.所以输出12.追问

谢谢,回答得超详细,不过这个*(*(a+6))还是不是很明白,我可以降它理解为这个数组的第七个数吗?但是它的结果是1245152,怎麼会有这麼多数字?

追答

你首先得明白指针a指向什么,然后你才能知道*(*(a+6))指向什么。a是数组名,即常量二维指针。它指向a[0]这个一维数组。所以a+6便是指针得后移6*sizeof(a[0])即6*4*sizeof(int)个字节。所以*(*(a+6))是该数组的第25个数,明显越界了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-02
这种题目是老师故意钻牛尖,所以,连专业人员可能都有点头疼,
特别是二维数组与指针之间的关系。
因为 a[6]越界了,所以,*(*(a+6)) 显示的将是 随机乱值!!!!
我刚用C++BUILDER6.0试过了。
*(*(a+6)) 其实就是 a[6][0], 比你定义的a[3][4]明显越界了!
第2个回答  2013-03-02
这个数字没有任何意义,我的输出结果是1638340,这句话的意思是输出a[6][0]的值,已经越界了,输出的是原本已经存在于内存的无意义的数字
相似回答