关于C语言二维数组与指针的疑问:为何三个printf输出地址相同?
二维数组地址值相同的原因解析
先看你的代码:
int td[][3] = {{1,2,3},{4,5,6}}; printf("%p\n", td[0]); printf("%p\n", &td[0]); printf("%p\n", &td[0][0]);
这三个printf输出相同地址值的核心原因是:它们指向内存中同一个起始位置,但各自的指针类型完全不同,只是地址值重合而已。具体拆解:
td[0]:td[0]是二维数组里的第一个一维数组(类型为int[3])。当数组名作为右值使用时,会自动转换为指向数组首元素的指针,也就是int*类型,指向td[0][0],地址值就是整个数组的起始地址。&td[0]:这里是对第一个一维数组td[0]取地址,得到的是指向这个一维数组的指针,类型为int (*)[3](指向包含3个int的数组的指针)。这个指针的地址值就是该一维数组的起始位置,也就是整个二维数组的起始地址,和上面的地址值完全重合。&td[0][0]:直接取第一个元素的地址,类型为int*,地址值自然是数组的起始地址。
虽然地址值相同,但类型不同会导致指针运算的结果差异很大:
td[0] + 1:会移动sizeof(int)字节(通常4字节),指向td[0][1]。&td[0] + 1:会移动sizeof(int[3])字节(通常12字节),指向td[1]的起始位置。
内容的提问来源于stack exchange,提问作者lemonades
相关产品推荐
相关产品推荐

