鱼C论坛

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

[已解决]数组是指针,数组名和数组地址相同,但是指针不适用

[复制链接]
发表于 2023-1-30 10:54:07 | 显示全部楼层 |阅读模式

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

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

x
求助:

一开始学数组,在地址上,数组名=数组地址=数组首地址,很好理解,记得也很清楚

  // 1.c
  1 #include <stdio.h>
  2
  3 int main(){
  4     int arr[4] = {1,2,3,4};
  5     printf("arr:%p,&arr:%p,&arr[0]:%p\n",arr,&arr,&arr[0]);
  6     return 0;
  7 }

// arr:0x7ffdf7dfc2c0,&arr:0x7ffdf7dfc2c0,&arr[0]:0x7ffdf7dfc2c0

在学指针的时候,正常使用也没有问题

  2.c
  1 #include <stdio.h>
  2
  3 int main(){
  4     int a = 1;
  5     int *p = &a;
  6     printf("%p\n",&p);
  7     printf("%p\n",p);
  8     char str[] = "hello";
  9     char *str2 = "world";
10     printf("%s\n",str2);
11 }

但是学完了指针再回顾数组,就对数组地址产生了疑问:上述1.c代码中的数组名arr本质上是const类型的指针(地址不可变),那么arr和&arr应该不相同的吧,为什么二者会相同呢
就像2.c中的&p与p不相同
最佳答案
2023-2-1 01:26:27
lpzju 发表于 2023-1-31 14:41
嗯,我现在知道的不同,主要就是数组是const类型的指针,既然是const类型的指针,所以不能成为左值
但是 ...

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-30 11:40:45 | 显示全部楼层
本帖最后由 jhq999 于 2023-1-30 11:43 编辑

你试试让arr=NULL;编译器能通过吗
试试
printf("arr:%p,&arr:%p,&arr[0]:%p\n","123",&"123",&"123"[0]);
千奇百怪,弄明白你的进一步了解一下汇编
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-31 13:21:56 | 显示全部楼层
jhq999 发表于 2023-1-30 11:40
你试试让arr=NULL;编译器能通过吗
试试

结果是这样,但是就是不明白为什么指针名等于指针首地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-31 13:36:47 | 显示全部楼层
数组和指针虽然操作上几乎一样,但是本质上数组和指针还是不同的,不能认为数组名等于指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-31 14:41:56 | 显示全部楼层
gandixiwang 发表于 2023-1-31 13:36
数组和指针虽然操作上几乎一样,但是本质上数组和指针还是不同的,不能认为数组名等于指针

嗯,我现在知道的不同,主要就是数组是const类型的指针,既然是const类型的指针,所以不能成为左值
但是我的疑问是为什么数组名和数组地址相同,这个在内存中怎么画呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-31 16:24:15 | 显示全部楼层
lpzju 发表于 2023-1-31 14:41
嗯,我现在知道的不同,主要就是数组是const类型的指针,既然是const类型的指针,所以不能成为左值
但是 ...

静态数组是编译器这么定义的,动态数组就不一样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-31 21:16:43 | 显示全部楼层
&p是p指针自身的地址啊
p是p值指向的地址(a)啊

arr是指向int数组的
&arr是arr[0]的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-31 21:21:11 | 显示全部楼层
ExiaGN001 发表于 2023-1-31 21:16
&p是p指针自身的地址啊
p是p值指向的地址(a)啊

&arr是arr整个数组的首地址,虽然和arr[0]地址相同,但与arr[0]并不是一个意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-1 01:26:27 | 显示全部楼层    本楼为最佳答案   
lpzju 发表于 2023-1-31 14:41
嗯,我现在知道的不同,主要就是数组是const类型的指针,既然是const类型的指针,所以不能成为左值
但是 ...

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

使用道具 举报

 楼主| 发表于 2023-2-1 08:49:46 | 显示全部楼层

谢谢,对于这个arr、arr[0],以及&arr的地址是比较清楚的了,看了后面解引用部分稍微了解了arr和&arr的不同用法,比之前清楚一些了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-1 23:28:05 | 显示全部楼层
本帖最后由 桃花飞舞 于 2023-2-1 23:47 编辑

所以啊,指针不是数组名,数组名也不是指针,这就是数组名与指针的区别了
而且arr和&arr也是不同的意思
arr是数组名,可以看做数组类型的变量。arr也是数组的首元素的地址也就是常量指针。arr+1偏移的就是数组中一个元素的长度
&arr就是这时候的arr是数组名,整个数组的地址,如果是&arr+1偏移的就是整个数组的的长度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-2 10:31:52 | 显示全部楼层
arr准确来说是一个迭代器,不是单纯的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-3 12:11:15 | 显示全部楼层
本帖最后由 两手空空儿 于 2023-2-3 12:35 编辑

按照数组名的用法,它应该是不占用空间的,你可以把数组名理解成一个lable, 它就在数组开始的位置上标记了一个 lable:arr,可以读但是不能改变它自己,就像有了const属性
你可以读到它自己所在的地址,就是它呆的地方, 也可以读到它指向的地址, 是同一个地方

大家只是学到数组的时候在纠结这个东西,其实在这之前我们早就这么用了, int a = 234; a是代表了234,【a本身】不占空间,234才占空间,【a本身】它指向了234所在的地址,它只是贴在234这个地方的标签,这个标签是const的,贴好了就不能动了,a的地址是234所在的地址, 234的地址也是它自己的位置       其实a不就是由4个字节组成的数组么,数组名就是a


这个好像和c++的引用很像
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 20:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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