数组是指针,数组名和数组地址相同,但是指针不适用
求助:一开始学数组,在地址上,数组名=数组地址=数组首地址,很好理解,记得也很清楚
// 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:43 编辑
你试试让arr=NULL;编译器能通过吗
试试
printf("arr:%p,&arr:%p,&arr:%p\n","123",&"123",&"123");
千奇百怪,弄明白你的进一步了解一下汇编 jhq999 发表于 2023-1-30 11:40
你试试让arr=NULL;编译器能通过吗
试试
结果是这样,但是就是不明白为什么指针名等于指针首地址 数组和指针虽然操作上几乎一样,但是本质上数组和指针还是不同的,不能认为数组名等于指针 gandixiwang 发表于 2023-1-31 13:36
数组和指针虽然操作上几乎一样,但是本质上数组和指针还是不同的,不能认为数组名等于指针
嗯,我现在知道的不同,主要就是数组是const类型的指针,既然是const类型的指针,所以不能成为左值
但是我的疑问是为什么数组名和数组地址相同,这个在内存中怎么画呢 lpzju 发表于 2023-1-31 14:41
嗯,我现在知道的不同,主要就是数组是const类型的指针,既然是const类型的指针,所以不能成为左值
但是 ...
静态数组是编译器这么定义的,动态数组就不一样了 &p是p指针自身的地址啊
p是p值指向的地址(a)啊
arr是指向int数组的
&arr是arr的地址 ExiaGN001 发表于 2023-1-31 21:16
&p是p指针自身的地址啊
p是p值指向的地址(a)啊
&arr是arr整个数组的首地址,虽然和arr地址相同,但与arr并不是一个意思 lpzju 发表于 2023-1-31 14:41
嗯,我现在知道的不同,主要就是数组是const类型的指针,既然是const类型的指针,所以不能成为左值
但是 ...
人造人 发表于 2023-2-1 01:26
谢谢,对于这个arr、arr,以及&arr的地址是比较清楚的了,看了后面解引用部分稍微了解了arr和&arr的不同用法,比之前清楚一些了 本帖最后由 桃花飞舞 于 2023-2-1 23:47 编辑
所以啊,指针不是数组名,数组名也不是指针,这就是数组名与指针的区别了
而且arr和&arr也是不同的意思
arr是数组名,可以看做数组类型的变量。arr也是数组的首元素的地址也就是常量指针。arr+1偏移的就是数组中一个元素的长度
&arr就是这时候的arr是数组名,整个数组的地址,如果是&arr+1偏移的就是整个数组的的长度。 arr准确来说是一个迭代器,不是单纯的指针 本帖最后由 两手空空儿 于 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]