本文共 1119 字,大约阅读时间需要 3 分钟。
二维数组的存储
以数组下标的方式来访问其中的某个元素:a[i][j]。编译器总是将二维数组看成是一个 一维数组,而一维数组的每一个元素又都是一个数组。
a[3]这个一维数组的三个元素分别为: a[0],a[1],a[2]。每个元素的大小为 sizeof(a[0]),即 sizof(char)*4。由此可以计算出 a[0],a[1],a[2] 三个元素的首地址分别为& a[0],& a[0]+ 1*sizof(char)*4,& a[0]+ 2*sizof(char)*4。亦即 a[i] 的首地址为& a[0]+ i*sizof(char)*4。
a[i]里面的内容。就本例而言,a[i]内有 4个 char 类型的元素,其每个元素的首地址分别为&a[i],&a[i]+1*sizof(char), &a[i]+2*sizof(char),&a[i]+3*sizof(char)。
即 a[i][j]的首地址为&a[i]+j*sizof(char)。
得到 a[i][j]元素的首地址为:a+ i*sizof(char)*4+ j*sizof(char)。同样,可以换算成以指针的形式表示:*(*(a+i)+j)
#includeint main(int argc,char * argv[]){int a [3][2]={(0,1),(2,3),(4,5)};int *p;p=a [0];printf("%d",p[0]);}问打印出来的结果是多少?很多人都觉得这太简单了,很快就能把答案告诉我:0。不过很可惜,错了。答案应该是 1。如果你也认为是 0,那你实在应该好好看看这个题。花括号里面嵌套的是小括号,而不是花括号!这里是花括号里面嵌套了逗号表达式!其实这个赋值就相当于 int a [3][2]={ 1, 3,5};所以,在初始化二维数组的时候一定要注意,别不小心把应该用的花括号写成小括号了。
#includevoid main() { char s=(4,5,67 ); printf("%d\n",s); } // the end is 67 . !!!!
main(){int a[5][5];int (*p)[4];p = a;printf("a_ptr=%#p,p_ptr=%#p\n",&a[4][2],&p[4][2]);printf("%p,%d\n",&p[4][2] - &a[4][2],&p[4][2] - &a[4][2]);return 0;}//the end is :-4, because :(4*4+2)-(4*5+2)
转载地址:http://sdtgf.baihongyu.com/