lpzju 发表于 2023-1-30 10:54:07

数组是指针,数组名和数组地址相同,但是指针不适用

求助:

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

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

// arr:0x7ffdf7dfc2c0,&arr:0x7ffdf7dfc2c0,&arr: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不相同

jhq999 发表于 2023-1-30 11:40:45

本帖最后由 jhq999 于 2023-1-30 11:43 编辑

你试试让arr=NULL;编译器能通过吗
试试
printf("arr:%p,&arr:%p,&arr:%p\n","123",&"123",&"123");
千奇百怪,弄明白你的进一步了解一下汇编

lpzju 发表于 2023-1-31 13:21:56

jhq999 发表于 2023-1-30 11:40
你试试让arr=NULL;编译器能通过吗
试试



结果是这样,但是就是不明白为什么指针名等于指针首地址

gandixiwang 发表于 2023-1-31 13:36:47

数组和指针虽然操作上几乎一样,但是本质上数组和指针还是不同的,不能认为数组名等于指针

lpzju 发表于 2023-1-31 14:41:56

gandixiwang 发表于 2023-1-31 13:36
数组和指针虽然操作上几乎一样,但是本质上数组和指针还是不同的,不能认为数组名等于指针

嗯,我现在知道的不同,主要就是数组是const类型的指针,既然是const类型的指针,所以不能成为左值
但是我的疑问是为什么数组名和数组地址相同,这个在内存中怎么画呢

jhq999 发表于 2023-1-31 16:24:15

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

静态数组是编译器这么定义的,动态数组就不一样了

ExiaGN001 发表于 2023-1-31 21:16:43

&p是p指针自身的地址啊
p是p值指向的地址(a)啊

arr是指向int数组的
&arr是arr的地址

lpzju 发表于 2023-1-31 21:21:11

ExiaGN001 发表于 2023-1-31 21:16
&p是p指针自身的地址啊
p是p值指向的地址(a)啊



&arr是arr整个数组的首地址,虽然和arr地址相同,但与arr并不是一个意思

人造人 发表于 2023-2-1 01:26:27

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

lpzju 发表于 2023-2-1 08:49:46

人造人 发表于 2023-2-1 01:26


谢谢,对于这个arr、arr,以及&arr的地址是比较清楚的了,看了后面解引用部分稍微了解了arr和&arr的不同用法,比之前清楚一些了

桃花飞舞 发表于 2023-2-1 23:28:05

本帖最后由 桃花飞舞 于 2023-2-1 23:47 编辑

所以啊,指针不是数组名,数组名也不是指针,这就是数组名与指针的区别了
而且arr和&arr也是不同的意思
arr是数组名,可以看做数组类型的变量。arr也是数组的首元素的地址也就是常量指针。arr+1偏移的就是数组中一个元素的长度
&arr就是这时候的arr是数组名,整个数组的地址,如果是&arr+1偏移的就是整个数组的的长度。

陈尚涵 发表于 2023-2-2 10:31:52

arr准确来说是一个迭代器,不是单纯的指针

两手空空儿 发表于 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++的引用很像
页: [1]
查看完整版本: 数组是指针,数组名和数组地址相同,但是指针不适用