首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按价值调用还是引用调用?

按价值调用还是引用调用?
EN

Stack Overflow用户
提问于 2014-01-16 14:52:46
回答 2查看 644关注 0票数 4

在下面的代码中,我将指向*example[10];或整个数组的指针传递给函数?

代码语言:javascript
复制
#include <stdio.h>

void function (int **)

int main ()
{
    int *example[10];
    function(example);
    return 0;
}

void function (int *example[10])
{
    /* ... */
    return;
}

以下代码也有相同的问题:

代码语言:javascript
复制
#include <stdio.h>

struct example
{
    int ex;
};

void function (struct example *)

int main ()
{
    struct example *e;
    function(e);
    return 0;
}

void function (struct example *e)
{
    /* ... */
    return;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-16 15:00:04

在C中,所有参数都是通过值传递的,包括指针。在传递数组的情况下,数组“衰变”到指向其初始元素的指针。

第一个函数将一个指针传递给一个由10个统一指针组成的块,该指针指向int。这可能很有用,因为function(int**)可以将数组中的指针更改为有效的指针。例如,允许这样做:

代码语言:javascript
复制
void function (int *example[10])
{
    for (int i = 0 ; i != 10 ; i++) {
        // Allocate a "triangular" array
        example[i] = malloc((i+1)*sizeof(int));
    }
}

(当然,调用方现在负责所有分配的内存)

第二个函数传递一个未初始化的指针。这是完全没用的,因为function(struct example *e)不能合法地分配或取消引用这个指针。

这将是非法的:

代码语言:javascript
复制
void function (struct example *e)
{
    e->ex = 123; // UNDEFINED BEHAVIOR! e is uninitialized
}

这不会对调用方中的e值产生影响:

代码语言:javascript
复制
void function (struct example *e)
{
    e = malloc(sizeof(struct example)); // Legal, but useless to the caller
}
票数 5
EN

Stack Overflow用户

发布于 2014-01-16 14:59:02

C只按值调用,因此(形式上)所有值都按值传递给函数。

但是,C语言中的数组处理方式与其他数据略有不同,因此在第一个示例中,数组示例被转换为指向其第一个元素的指针,然后将该指针(按值)传递给函数。

在您的第二个示例中,e是一个指向结构的指针(但它从未设置为指向任何位置),并且您将该指针(按值)传递给函数。

在这两种情况下,参数传递都是通过值完成的,但是当您传递指向变量的指针时,被调用的函数可以对原始变量进行更改。

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

https://stackoverflow.com/questions/21165114

复制
相关文章

相似问题

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