C语言二维数组问题
#include"stdio.h"int main(void)
{
int a = { { 2, 4 }, { 6, 8 }, { 1, 3 }, { 5, 7 } };
printf("%p %p\n", a, a + 1);
printf("%p %p\n", a, a + 1);
getchar();
return 0;
}
上面的代码,运行结果,a和a+1的值有时候相差2,有时候相差8,很难理解a到底代表着什么?有人能够指点一下么 本帖最后由 ltt1986 于 2015-10-5 16:50 编辑
a本质上是一个2级指针,它的步长就是一行8个字节,
a是第0行首元素地址,a+1是第一行首元素地址,
相差8是因为1行有2个单位,每个int型占据4字节(32位下),sizeof(int) *2=8
a 它的步长是4个字节,指向第0行第0列 ,a+1指向第0行第1列 ,两者相差4个字节,其实都是个指针,打印出来的是个地址,相差sizeof(int) 4个字节
二维数组的二级指针其实会退化,int a 相当于 int (*a),两者的内存模型是一样的
你这是2级指针做输入,一共3总模型 int *a[] int (*a)[] int **a
附上第二种内存模型图
[ a代表数组的起始地址。 ltt1986 发表于 2015-10-5 16:41
a本质上是一个2级指针,它的步长就是一行8个字节,
a是第0行首元素地址,a+1是第一行首元素地址,
相差8是因 ...
嗯相差8的我知道就是相差2是为什么呢跟那个退化是有联系么求解答谢谢 counting_stars 发表于 2015-10-5 17:04
嗯相差8的我知道就是相差2是为什么呢跟那个退化是有联系么求解答谢谢
a和 a + 1相差4个字节,,不是2个字节,
就是a表示2的值所在的地址,
a+1 表示4的值所在的地址
相差一个int 类型的大小
你自己编译下看看 ,你用的是%p , 那个地址是16进制表示的 ltt1986 发表于 2015-10-5 17:12
a和 a + 1相差4个字节,,不是2个字节,
就是a表示2的值所在的地址,
a+1 表示4的值所 ...
哦我知道了 谢谢{:5_106:} 学习了,对指针也不是很理解
学习了
页:
[1]