关于*(array+1)==array[1]
看视频,我一直没明白二维数组*(array+1)==array这个怎么成立的?array不是相当于是第二行行地址吗?而*(array+1)不是第二行第一个元素的值吗?两个怎么相等。看了一些资料有点闷。请大家帮忙解惑下。同理的就是*(a+i)==a。另外问下为什么不能插入图片呢。 我觉得直接解释你也是迷迷糊糊的。。。不如这样
请用清晰的逻辑叙述一下为什么*(array+1)是第二行第一个元素的值。
然后我们来找一找这个解释有哪里不对^_^ Croper 发表于 2020-1-5 22:01
我觉得直接解释你也是迷迷糊糊的。。。
不如这样
好的,因为array是二维数组的变量名,变量名同时也是代表数组首元素的地址嘛,array==&array,同时array也是首行的行指针,array+1,也就认为是第二行的行指针,同时array+1==&array,那么
*(array+1)==*&array==array,结束了,哈哈,请放大招吧,想了两天没想明白。 不不不,你再仔细想一想
array 和 &array只是值相等,类型并不相同
而
array和&array,他们的类型才是相同的。
你这个地方多解引用了一步
你的疑问也在这里,
你觉得*(array+1)==a而不是a也是因为你前面这里多解引用了一步,所以这里就差一步
本帖最后由 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; 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,
Croper 发表于 2020-1-5 22:21
不不不,你再仔细想一想
array 和 &array只是值相等,类型并不相同
而
能抽空再帮我看看不?{:10_334:} bin554385863 发表于 2020-1-5 22:26
一维数组:
arr * (arr+k)
二维数组:
感谢回复,我看看。 大部分都没什么问题,
不过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
恩,这种用法是不会报错而且是正确的 Croper 发表于 2020-1-6 22:09
大部分都没什么问题,
不过
是什么鬼。。右值是不能取地址的- -
谢谢,明白了,写错了。{:10_256:} 333 可以把二维数组中每一个元素数组想成一个整天的地址值,而这个值同时也是每个元素数组的首地址 JohnEric 发表于 2020-4-5 11:38
可以把二维数组中每一个元素数组想成一个整天的地址值,而这个值同时也是每个元素数组的首地址
整体的“地址”值
页:
[1]