【问题标题】:Simple clarification about pass by reference vs. pass by value关于按引用传递与按值传递的简单说明
【发布时间】:2014-05-09 11:38:26
【问题描述】:

我声明了一个变量(TEST 类型,包含一个静态数组)并调用了几个函数,传递了一个指向该变量的指针。

typedef struct
{
     char data[50];
} TEST;

int main(int argc,char *argv[])
{
    TEST *ptr = malloc(sizeof(TEST));
    func_one(ptr);
    printf("data: %s\n", ptr->data);
}

void func_one(TEST *ptr)
{
    func_two(ptr);
}

void func_two(TEST *ptr)
{
    strcpy(ptr->data, "hello");
}

上面的打印语句会打印“hello”吗?我的程序当前打印“hello”,但我很困惑,因为据我了解,我知道 ptr 是按值传递的,而不是按引用传递的。

【问题讨论】:

    标签: c pointers pass-by-reference


    【解决方案1】:

    你是对的,指针是按值传递的,所以main函数中的指针ptr复制func_one中的ptr变量,它就是依次复制到func_two 中的ptr 变量。

    然而,你不是试图修改指针,而是它指向的数据,所以 data 是通过引用传递的,但指向数据的指针不是。

    虽然技术上 C 没有“按引用传递”,但它只能通过使用指针来模拟。

    此外,如果您没有在堆上分配数据并使用地址操作符,您将得到相同的结果:

    TEST data;
    func_one(&test);
    

    【讨论】:

      【解决方案2】:

      指针是按值传递的,这是正确的。这意味着被指向的数组是通过引用传递的。

      (我有一种感觉,在最纯粹的计算机科学意义上,这可能是不正确的,但对于所有实际目的来说已经足够接近了)。

      【讨论】:

        【解决方案3】:

        按引用传递意味着您正在传递对某些数据的引用。按值传递意味着您正在传递一些数据的副本。

        在这种情况下,您将按值传递指针。但什么是指针?这是对一些数据的引用。

        您通过值传递指针本身,但鉴于它是一个指针,副作用是它指向的任何数据本质上都是通过引用传递的。

        【讨论】:

        • 但是如果 data 是一个指针 (char *data),我想在 func_two 中进行 malloc,那么 func_one 和 func_two 应该会收到 TEST **ptr。对吗?
        猜你喜欢
        • 2014-09-08
        • 1970-01-01
        • 2016-10-22
        • 2023-03-02
        • 2012-07-03
        • 1970-01-01
        • 2013-04-12
        相关资源
        最近更新 更多