这个地方在看书的时候有点绕,花了点时间顺了顺思路,大概记一下。
先声明个二维数组:

1
int zippo[2][2]; //整数数组的数组

之所以被绕进去是因为下面两点:

把上面两点合起来看的话,就有:
zippo == &zippo
zippo[0] == &zippo[0][0]
也就是有:
zippo[0] == &zippo[0] //zippo[0]存的是自己的地址??
&zippo[0] == &zippo[0][0] //两个不同值的地址竟然一样??
我就是在这里绕进去了,囧~
自己写了个小函数测试下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main(void)
{
int zippo[2][2] = {{1, 2}, {3, 4}};
//二维数组首地址和第一维数组首地址相同
printf("zippo = %p\n", zippo);
printf("&zippo[0] = %p\n", &zippo[0]);
printf("zippo[0] = %p\n", zippo[0]);
printf("&zippo[0][0] = %p\n\n", &zippo[0][0]);
printf("*&zippo[0] = %p\n", *&zippo[0]);
printf("*&zippo[0][0] = %d\n\n", *&zippo[0][0]);

//看看第一维第二个和第二维第一个地址是否相同
printf("&zippo[1] = %p\n", &zippo[1]);
printf("&zippo[1][0] = %p\n", &zippo[1][0]);
return 0;
}

编译运行结果:

没出意外,就是想的这样。

为什么呢???

1
2
printf("*&zippo[0] = %p\n", *&zippo[0]);
printf("*&zippo[0][0] = %d\n\n", *&zippo[0][0]);

上面这两行代码让我意识到,为什么地址相同的变量,值却不同?恍然大悟啊我去,真相原来是这样的:
很多计算机都是以字节编地址对象的地址通常指的是其首字节的地址。
首字节,
首字节!
是我没把这里理解好,其实取址运算符和指针的值都是存储的变量的首字节的值(十六进制)。
随便画了张,随便看看吧~

首字节相同相同那太正常了啊喂~请嘲笑我的智商吧~~~

Comments