关于通过引用传递与按值传递的简单说明

时间:2014-05-09 11:38:27

标签: c pointers pass-by-reference

我声明一个变量(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");
}

以上打印声明是否打印"你好"?我的程序目前打印"你好"但我很困惑,因为从我的理解,我知道ptr是通过值而不是通过引用传递的。

3 个答案:

答案 0 :(得分:4)

你是对的,指针是按值传递的,因此ptr函数中的指针main复制ptr变量{ {1}},然后将其复制到func_one中的ptr变量。

但是,您并没有尝试修改指针,而是指向它指向的数据,因此数据通过引用传递,但指向数据的指针不是。

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

此外,如果您没有在堆上分配数据,并使用address-of运算符,您将获得相同的结果:

func_two

答案 1 :(得分:1)

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

(我觉得在最纯粹的计算机科学意义上可能是不正确的,但它足够接近所有实际目的)。

答案 2 :(得分:1)

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

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

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