我声明一个变量(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是通过值而不是通过引用传递的。
答案 0 :(得分:4)
你是对的,指针是按值传递的,因此ptr
函数中的指针main
被复制到ptr
变量{ {1}},然后将其复制到func_one
中的ptr
变量。
但是,您并没有尝试修改指针,而是指向它指向的数据,因此数据通过引用传递,但指向数据的指针不是。
虽然技术上C没有“按引用传递”,但只能使用指针进行模拟。
此外,如果您没有在堆上分配数据,并使用address-of运算符,您将获得相同的结果:
func_two
答案 1 :(得分:1)
指针正在按值传递,这是正确的。这意味着被引用的数组通过引用传递。
(我觉得在最纯粹的计算机科学意义上可能是不正确的,但它足够接近所有实际目的)。
答案 2 :(得分:1)
传递引用意味着您正在传递对某些数据的引用。按值传递意味着您传递了一些数据的副本。
在这种情况下,您将按值传递指针。但是什么是指针?它是对某些数据的引用。
你是通过值传递指针本身,但鉴于它是一个指针,副作用是它指向的任何数据基本上都是通过引用传递的。