鱼C论坛

 找回密码
 立即注册
查看: 2479|回复: 12

[已解决]关于*(array+1)==array[1]

[复制链接]
发表于 2020-1-5 21:56:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
看视频,我一直没明白二维数组  *(array+1)==array[1]  这个怎么成立的?array[1]不是相当于是第二行行地址吗?而*(array+1)不是第二行第一个元素的值吗?两个怎么相等。看了一些资料有点闷。请大家帮忙解惑下。同理的就是*(a+i)==a[i]。  另外问下为什么不能插入图片呢。
最佳答案
2020-1-5 22:21:24
不不不,你再仔细想一想
array 和 &array[0][0]只是值相等,类型并不相同

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

你的疑问也在这里,
你觉得*(array+1)==a[1][0]而不是a[1]也是因为你前面这里多解引用了一步,所以这里就差一步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-5 22:01:16 | 显示全部楼层
我觉得直接解释你也是迷迷糊糊的。。。

不如这样

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

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

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-5 22:12:18 | 显示全部楼层
Croper 发表于 2020-1-5 22:01
我觉得直接解释你也是迷迷糊糊的。。。

不如这样

好的,因为array是二维数组的变量名,变量名同时也是代表数组首元素的地址嘛,array==&array[0][0],同时array也是首行的行指针,array+1,也就认为是第二行的行指针,同时array+1==&array[1][0],那么
*(array+1)==*&array[1][0]==array[1][0],  结束了,哈哈,请放大招吧,想了两天没想明白。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-5 22:21:24 | 显示全部楼层    本楼为最佳答案   
不不不,你再仔细想一想
array 和 &array[0][0]只是值相等,类型并不相同

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

你的疑问也在这里,
你觉得*(array+1)==a[1][0]而不是a[1]也是因为你前面这里多解引用了一步,所以这里就差一步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-5 22:26:00 | 显示全部楼层
本帖最后由 bin554385863 于 2020-1-5 22:27 编辑
召唤师 发表于 2020-1-5 22:12
好的,因为array是二维数组的变量名,变量名同时也是代表数组首元素的地址嘛,array==&array[0][0],同时ar ...


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

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

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

int arr[4][3] = {{1, 2, 3},
                       {4, 5, 6},
                       {7, 8, 9},
                       {0, 0, 0}};
红色的即arr[k][0]则arr+k == &arr[k][0];
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-1-6 00:47:00 | 显示全部楼层
Croper 发表于 2020-1-5 22:21
不不不,你再仔细想一想
array 和 &array[0][0]只是值相等,类型并不相同

好的,我结合最近看的书和视频以及您的回复仔细想了想,我好想明白了,我再描述一下我理解的,您帮我看看有没有错:
为了说明清楚我举个例子
int a[3][4]={{1,2,3,4},{4,5,6,7},{7,8,9,10}};
1、其实这个二维数组就是三个一维数组a[0],a[1],a[2]组成,且a[0],a[1],a[2]也是对应一维数组的函数名,因此就可以套用一维数组的知识:数组的函数名等于数组首元素的地址,综上在数值上a==a[0]==&a[0][0],这个相等仅仅上是地址的数值是一样的,他们的类型是不同。为什么类型不同呢?因为这个可以从他们的对应地址+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[0]=%p\n", &a[0]);
    printf("&a[0]+1=%p\n", &a[0]+1);
    printf("&a[0][0]=%p\n", &a[0][0]);
    printf("&a[0][0]+1=%p\n", &a[0][0]+1);
这段代码就说明了您说的“array 和 &array[0][0]只是值相等,类型并不相同   而array和&array[0],他们的类型才是相同的。”    我从本质上来理解就是a[0]是一维数组的指针,他有四个int类型的元素,相当于是一个数组指针,所以一个指针的长度就是4*4=16字节。而&a[0][0]只是一个int类型元素的指针,指针大小是4字节。a[0]也是一维数组的数组名,他仅仅等于一维数组首元素的地址,即a[0]==&a[0][0],要想让获得一维数组的指针则是&a[0].   

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-1-6 21:38:44 | 显示全部楼层
Croper 发表于 2020-1-5 22:21
不不不,你再仔细想一想
array 和 &array[0][0]只是值相等,类型并不相同

能抽空再帮我看看不?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-6 21:42:59 | 显示全部楼层
bin554385863 发表于 2020-1-5 22:26
一维数组:
arr[k] * (arr+k)
二维数组:

感谢回复,我看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-6 22:09:06 | 显示全部楼层
大部分都没什么问题,
不过
  1. a+i==&(a+i),   
复制代码

是什么鬼。。右值是不能取地址的- -

另外,不需要推理,
  1. a[i]
复制代码

就是
  1. *(a+i)
复制代码
的一个简便表示方法而已,a[1],a[2],a[3]最早就是作为一个语法糖出现的



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

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


输出:
  1. 1 2 3
复制代码

恩,这种用法是不会报错而且是正确的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-6 22:34:57 | 显示全部楼层
Croper 发表于 2020-1-6 22:09
大部分都没什么问题,
不过
是什么鬼。。右值是不能取地址的- -

谢谢,明白了,写错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-5 00:32:59 | 显示全部楼层
333
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-5 11:38:15 From FishC Mobile | 显示全部楼层
可以把二维数组中每一个元素数组想成一个整天的地址值,而这个值同时也是每个元素数组的首地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-5 11:40:31 From FishC Mobile | 显示全部楼层
JohnEric 发表于 2020-4-5 11:38
可以把二维数组中每一个元素数组想成一个整天的地址值,而这个值同时也是每个元素数组的首地址

整体的“地址”值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 15:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表