首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >args和&args有什么区别?

args和&args有什么区别?
EN

Stack Overflow用户
提问于 2014-11-25 07:04:57
回答 5查看 152关注 0票数 4

这是我的代码片段

代码语言:javascript
复制
    #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;
   }

我运行它,它得到的结果如下

代码语言:javascript
复制
    0x7fff5def1c60
    0x7fff5def1c38

正如我们所看到的,实际的参数地址与形式参数地址不同,所以我编辑了以下内容

代码语言:javascript
复制
    #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;
    }

然后我得到了结果

代码语言:javascript
复制
    0x7fff56501c60
    0x7fff56501c60

因此,实际参数和形式参数似乎具有相同的地址。我感到困惑的是&a和a(a是数组)之间有什么不同,以及为什么我从第一个片段中得到不同的地址?谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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中完成--因为一个指针分配了内存,因此可以像其他变量一样更改它的值,而另一个只是它的第一个元素的占位符,因此不能更改它的值。

我希望现在清楚为什么&bb是一样的--因为b不是一个独立的变量,内存中有一个位置,所以您不能要求它的地址--它只会给出b所代表的地址。

票数 1
EN

Stack Overflow用户

发布于 2014-11-25 07:10:11

在:

代码语言:javascript
复制
printf("%p\n",&b);

您正在将地址打印到第一个数组单元格。

在:

代码语言:javascript
复制
change(b);

特别是在以下方面:

代码语言:javascript
复制
void change(int a[]){
    printf("%p\n",&a);
}

您正在打印变量a的地址,它本身就是一个衰变的指针。因此,它在语义上相当于:

代码语言:javascript
复制
void change(int* a){
    printf("%p\n",&a);
}

要检索数组的第一个单元格,需要将函数编写为:

代码语言:javascript
复制
void change(int* a){
    printf("%p\n", a);
    //            ^^
}
票数 4
EN

Stack Overflow用户

发布于 2014-11-25 07:17:02

您可以认为a是存储array[1, 2]的内存的起始地址。还请考虑a是一个存储数组地址的变量。变量意味着它本身在内存中的某个位置。所以&a是变量a的地址。总之,内存中的address &a存储array[1,2]的地址。

在第一个例子中,您将变量b的地址传递给函数change,以便函数变量a存储变量b的地址。但是&aa的地址,而不是a的内容。这就是造成这种差异的原因。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27120613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档