这是我的代码片段
#include <stdio.h>
void change(int a[]){
printf("%p\n",&a);
}
int main(){
int b[] = {1,2} ;
printf("%p\n",&b);
change(b);
return 0;
}我运行它,它得到的结果如下
0x7fff5def1c60
0x7fff5def1c38正如我们所看到的,实际的参数地址与形式参数地址不同,所以我编辑了以下内容
#include <stdio.h>
void change(int a[]){
printf("%p\n",a);
}
int main(){
int b[] = {1,2} ;
printf("%p\n",b);
change(b);
return 0;
}然后我得到了结果
0x7fff56501c60
0x7fff56501c60因此,实际参数和形式参数似乎具有相同的地址。我感到困惑的是&a和a(a是数组)之间有什么不同,以及为什么我从第一个片段中得到不同的地址?谢谢!
发布于 2014-11-25 08:04:05
因为我认为到目前为止的答案还不够强调,所以我会给出另一个答案:
如果b是数组,那么b和没有区别。数组几乎像指针,但不是100%。如您所知,指针是存储地址的变量。因此,当您创建指针p时,您将创建一个新变量,然后为其分配一些地址。现在指针变量p有一个地址,它的值也是一个地址。您可以用它做三件事:-用&p获取&p的地址-用p获取p的值-用*p获取p的取消引用的值。
对于数组ar,它是不同的。它的作用就像一个指针,但是它是而不是--一个存储入口的独立变量!通过创建一个数组,您只为要存储的元素分配内存,而为存储这些元素地址的变量分配而不是。变量ar只是表示第一个元素的地址,但它不会保存在额外的空间中;编译器确保将ar转换为第一个元素的内存--这一点很重要。所以你能做的是:-用&ar 获取&ar的地址,用ar获取的地址,用ar[0]获取ar的值。
这就是为什么在您的change函数中,int a[]与int *a相同,但是在主函数中,int b[]是而不是与int *b相同。后者为一个地址分配内存,而第一个只为指定数量的元素创建内存,并且只使用b作为这些元素的第一个地址的占位符--没有为第一个元素的地址分配额外内存,就像使用指针一样。
这也是为什么在main中不能执行b = some_pointer,但是可以在change中完成--因为一个指针分配了内存,因此可以像其他变量一样更改它的值,而另一个只是它的第一个元素的占位符,因此不能更改它的值。
我希望现在清楚为什么&b和b是一样的--因为b不是一个独立的变量,内存中有一个位置,所以您不能要求它的地址--它只会给出b所代表的地址。
发布于 2014-11-25 07:10:11
在:
printf("%p\n",&b);您正在将地址打印到第一个数组单元格。
在:
change(b);特别是在以下方面:
void change(int a[]){
printf("%p\n",&a);
}您正在打印变量a的地址,它本身就是一个衰变的指针。因此,它在语义上相当于:
void change(int* a){
printf("%p\n",&a);
}要检索数组的第一个单元格,需要将函数编写为:
void change(int* a){
printf("%p\n", a);
// ^^
}发布于 2014-11-25 07:17:02
您可以认为a是存储array[1, 2]的内存的起始地址。还请考虑a是一个存储数组地址的变量。变量意味着它本身在内存中的某个位置。所以&a是变量a的地址。总之,内存中的address &a存储array[1,2]的地址。
在第一个例子中,您将变量b的地址传递给函数change,以便函数变量a存储变量b的地址。但是&a是a的地址,而不是a的内容。这就是造成这种差异的原因。
https://stackoverflow.com/questions/27120613
复制相似问题