|
|
5鱼币
#include <stdio.h>
void main()
{
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
printf("a: %d\n", a);
printf("*a: %d\n", *a);
printf("a[0]: %d\n", a[0]);
printf("&a[0]: %d\n", &a[0]);
printf("&a[0][0]: %d\n", &a[0][0]);
printf("a+1: %d\n", a+1);
printf("*(a+1): %d\n", *(a+1));
printf("a[1]: %d\n", a[1]);
printf("&a[1]: %d\n", &a[1]);
printf("&a[1][0]: %d\n", &a[1][0]);
printf("a+2: %d\n", a+2);
printf("*(a+2): %d\n", *(a+2));
printf("a[2]: %d\n", a[2]);
printf("&a[2]: %d\n", &a[2]);
printf("&a[2][0]: %d\n", &a[2][0]);
printf("a[1]+1: %d\n", a[1]+1);
printf("*(a+1)+1: %d\n", *(a+1)+1);
printf("*(a[1]+1): %d\n", *(a[1]+1));
printf("*(*(a+1)+1): %d\n", *(*(a+1)+1));
}
得到
01 a: 1638168//这里明白 a是地址
02 *a: 1638168 //这里不懂为什么不是一个值而是地址 超级不懂!!
03 a[0]: 1638168//这里明白 a[0]也是地址
04 &a[0]: 1638168//这里不明白 a[0]不就是一个地址吗,为什么还要取地址呢?(个人认为a[0]还是值,所以&a[0]=a[0]=a)
05 &a[0][0]: 1638168//同上
06 a+1: 1638184//这里也不明白为什么a+1加了16个字节 而不是4个字节? 超级不懂!!
07 *(a+1): 1638184//这里a+1的地址不是1638184吗 为什么取值却是1638184?
08 a[1]: 1638184//再问应该就重复了吧 哈哈!! 请指导一下 谢谢 迷茫中.... 提点小要求,回复的时候请加上序号 谢谢 真的很谢谢
09 &a[1]: 1638184
10 &a[1][0]: 1638184
11 a+2: 1638200
12 *(a+2): 1638200
13 a[2]: 1638200
14 &a[2]: 1638200
15 &a[2][0]: 1638200
16 a[1]+1: 1638188
17 *(a+1)+1: 1638188//还有这里,上面的明白后这里应该也能明白。
18 *(a[1]+1): 5
19 *(*(a+1)+1): 5
Press any key to continue
|
最佳答案
查看完整内容
先了解一下二维数组吧
数组的逻辑结构是图中这样的,由于内存是线性的,所以在内存中4是接在3后面,8接在7后面,只有一行,但在C语言中,我们并不是直接对内存进行操作,要考虑行的地址
先说一维数组:若int a[2]={0,1},则a是地址,a[1]==*(a+1)==1
再说二维数组:对比一维数组,从二维数组的定义方式a[3][4]可以看出,二维数组是一个存放一维数组的数组,如图中,每一行是一个一维数组,共3个一维数组
a是整个数组的首地址 ...
|