counting_stars 发表于 2015-10-5 13:35:40

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:41:54

本帖最后由 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   
附上第二种内存模型图
[

ravenhu13 发表于 2015-10-5 16:43:54

a代表数组的起始地址。

counting_stars 发表于 2015-10-5 17:04:49

ltt1986 发表于 2015-10-5 16:41
a本质上是一个2级指针,它的步长就是一行8个字节,
a是第0行首元素地址,a+1是第一行首元素地址,
相差8是因 ...

嗯相差8的我知道就是相差2是为什么呢跟那个退化是有联系么求解答谢谢

ltt1986 发表于 2015-10-5 17:12:30

counting_stars 发表于 2015-10-5 17:04
嗯相差8的我知道就是相差2是为什么呢跟那个退化是有联系么求解答谢谢

a和 a + 1相差4个字节,,不是2个字节,
就是a表示2的值所在的地址,
a+1 表示4的值所在的地址
相差一个int 类型的大小
你自己编译下看看 ,你用的是%p , 那个地址是16进制表示的

counting_stars 发表于 2015-10-5 17:36:06

ltt1986 发表于 2015-10-5 17:12
a和 a + 1相差4个字节,,不是2个字节,
就是a表示2的值所在的地址,
a+1 表示4的值所 ...

哦我知道了   谢谢{:5_106:}

甲鱼牙1 发表于 2015-10-7 17:40:48

学习了,对指针也不是很理解

ianv 发表于 2015-10-10 12:45:12

学习了
页: [1]
查看完整版本: C语言二维数组问题