召唤师 发表于 2020-1-5 21:56:36

关于*(array+1)==array[1]

看视频,我一直没明白二维数组*(array+1)==array这个怎么成立的?array不是相当于是第二行行地址吗?而*(array+1)不是第二行第一个元素的值吗?两个怎么相等。看了一些资料有点闷。请大家帮忙解惑下。同理的就是*(a+i)==a。另外问下为什么不能插入图片呢。

Croper 发表于 2020-1-5 22:01:16

我觉得直接解释你也是迷迷糊糊的。。。

不如这样

请用清晰的逻辑叙述一下为什么*(array+1)是第二行第一个元素的值。

然后我们来找一找这个解释有哪里不对^_^

召唤师 发表于 2020-1-5 22:12:18

Croper 发表于 2020-1-5 22:01
我觉得直接解释你也是迷迷糊糊的。。。

不如这样


好的,因为array是二维数组的变量名,变量名同时也是代表数组首元素的地址嘛,array==&array,同时array也是首行的行指针,array+1,也就认为是第二行的行指针,同时array+1==&array,那么
*(array+1)==*&array==array,结束了,哈哈,请放大招吧,想了两天没想明白。

Croper 发表于 2020-1-5 22:21:24

不不不,你再仔细想一想
array 和 &array只是值相等,类型并不相同

array和&array,他们的类型才是相同的。
你这个地方多解引用了一步

你的疑问也在这里,
你觉得*(array+1)==a而不是a也是因为你前面这里多解引用了一步,所以这里就差一步

bin554385863 发表于 2020-1-5 22:26:00

本帖最后由 bin554385863 于 2020-1-5 22:27 编辑

召唤师 发表于 2020-1-5 22:12
好的,因为array是二维数组的变量名,变量名同时也是代表数组首元素的地址嘛,array==&array,同时ar ...

一维数组:
arr <=>* (arr+k)
二维数组:

arr <=> *(*(arr+k)+j)

arr即*(arr+k)可以认为是二维数组中每个一维数组的首项的地址

int arr = {{1, 2, 3},
                     {4, 5, 6},
                     {7, 8, 9},
                     {0, 0, 0}};
红色的即arr则arr+k == &arr;

召唤师 发表于 2020-1-6 00:47:00

Croper 发表于 2020-1-5 22:21
不不不,你再仔细想一想
array 和 &array只是值相等,类型并不相同



好的,我结合最近看的书和视频以及您的回复仔细想了想,我好想明白了,我再描述一下我理解的,您帮我看看有没有错:
为了说明清楚我举个例子
int a={{1,2,3,4},{4,5,6,7},{7,8,9,10}};
1、其实这个二维数组就是三个一维数组a,a,a组成,且a,a,a也是对应一维数组的函数名,因此就可以套用一维数组的知识:数组的函数名等于数组首元素的地址,综上在数值上a==a==&a,这个相等仅仅上是地址的数值是一样的,他们的类型是不同。为什么类型不同呢?因为这个可以从他们的对应地址+1的值可以看出来,大小不同。
如以下代码运行可以知道:

    printf("a=%p\n", a);
    printf("a+1=%p\n", a+1);
    printf("&a=%p\n", &a);
    printf("&a+1=%p\n", &a+1);
    printf("&a=%p\n", &a);
    printf("&a+1=%p\n", &a+1);
    printf("&a=%p\n", &a);
    printf("&a+1=%p\n", &a+1);
这段代码就说明了您说的“array 和 &array只是值相等,类型并不相同   而array和&array,他们的类型才是相同的。”    我从本质上来理解就是a是一维数组的指针,他有四个int类型的元素,相当于是一个数组指针,所以一个指针的长度就是4*4=16字节。而&a只是一个int类型元素的指针,指针大小是4字节。a也是一维数组的数组名,他仅仅等于一维数组首元素的地址,即a==&a,要想让获得一维数组的指针则是&a.   

所以以上啰嗦了一大堆其实就是   数组名和数组地址和数组首元素地址,这三个数值上一样,类型不一样,不要搞混了。

2.由上可知,a==&a,      ∴*a==*&a即*a==a,
同理,         a+i==&(a+i),    ∴*(a+i)==*&a即*(a+i)==a,

召唤师 发表于 2020-1-6 21:38:44

Croper 发表于 2020-1-5 22:21
不不不,你再仔细想一想
array 和 &array只是值相等,类型并不相同



能抽空再帮我看看不?{:10_334:}

召唤师 发表于 2020-1-6 21:42:59

bin554385863 发表于 2020-1-5 22:26
一维数组:
arr * (arr+k)
二维数组:


感谢回复,我看看。

Croper 发表于 2020-1-6 22:09:06

大部分都没什么问题,
不过a+i==&(a+i),   
是什么鬼。。右值是不能取地址的- -

另外,不需要推理,
a
就是
*(a+i)的一个简便表示方法而已,a,a,a最早就是作为一个语法糖出现的



//因为a=*(a+1)=*(1+a)=1
//甚至可以这样使用

int a[]={1,2,3,4,5};
printf("%d %d %d",0,1,2);


输出:
1 2 3
恩,这种用法是不会报错而且是正确的

召唤师 发表于 2020-1-6 22:34:57

Croper 发表于 2020-1-6 22:09
大部分都没什么问题,
不过
是什么鬼。。右值是不能取地址的- -


谢谢,明白了,写错了。{:10_256:}

召唤师 发表于 2020-4-5 00:32:59

333

JohnEric 发表于 2020-4-5 11:38:15

可以把二维数组中每一个元素数组想成一个整天的地址值,而这个值同时也是每个元素数组的首地址

JohnEric 发表于 2020-4-5 11:40:31

JohnEric 发表于 2020-4-5 11:38
可以把二维数组中每一个元素数组想成一个整天的地址值,而这个值同时也是每个元素数组的首地址

整体的“地址”值
页: [1]
查看完整版本: 关于*(array+1)==array[1]