[英]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_one
的ptr
变量,然后又被复制到func_two
的ptr
变量。
但是,您不是在尝试修改指针,而是要修改它指向的数据,因此它是通过引用传递的数据 ,但不是指向数据的指针。
尽管从技术上讲C没有“按引用传递”,但是只能使用指针对其进行仿真。
同样,您将得到与未在堆上分配数据并使用address-of运算符相同的结果:
TEST data;
func_one(&test);
指针是按值传递的,这是正确的。 这意味着所指向的数组是通过引用传递的。
(我觉得从最纯粹的计算机科学的角度来看,这可能是错误的,但对于所有实际目的而言,它都足够接近)。
引用传递意味着您正在传递对某些数据的引用。 按值传递意味着您正在传递一些数据的副本。
在这种情况下,您要按值传递指针。 但是指针是什么? 它是对某些数据的引用。
您正在按值传递指针本身,但是考虑到它是指针,其副作用是它指向的任何数据实质上都是通过引用传递的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.