繁体   English   中英

关于按引用传递和按值传递的简单说明

[英]Simple clarification about pass by reference vs. pass by value

我声明一个变量(类型为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是通过值而不是通过引用传递的。

没错,指针是按值传递的,因此main函数中的指针ptr复制func_oneptr变量,然后又被复制到func_twoptr变量。

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

尽管从技术上讲C没有“按引用传递”,但是只能使用指针对其进行仿真。

同样,您将得到与未在堆上分配数据并使用address-of运算符相同的结果:

TEST data;
func_one(&test);

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

(我觉得从最纯粹的计算机科学的角度来看,这可能是错误的,但对于所有实际目的而言,它都足够接近)。

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

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

您正在按值传递指针本身,但是考虑到它是指针,其副作用是它指向的任何数据实质上都是通过引用传递的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM