我试图理解传递值和传递参考之间的区别,我认为我终于明白了,直到我看到这段代码:
void change(char *p1)
{
p1="new";
}
int main()
{
char *txt1=(char*)malloc(200*sizeof(char));
txt1="original";
printf("before :%s\n",txt1);
change(txt1);
printf("after :%s\n",txt1);
}
是不是通过了地址?然后改变它并指向其他地方?
输出结果为:
之前:原创
之后:原创
为什么?
答案 0 :(得分:2)
这是将地址作为值传递。要让被调用者修改调用者的局部变量,请传递应该修改的内容。
#include <stdio.h>
void change(char **p1)
{
*p1="new";
}
int main(void)
{
char *txt1; /* no causing memory leak */
txt1="original";
printf("before :%s\n",txt1);
change(&txt1);
printf("after :%s\n",txt1);
}
答案 1 :(得分:2)
C中没有 pass-by-reference 。函数参数使用pass-by-value传递。也就是说,p1
本身是按值传递的。您可以从被调用函数更改p1
(*p1
)指向的内存地址的内容,而不是p1
本身。
为了澄清,要更改变量var
的内容,您需要传递var
的地址,因此,如果您想更改指针本身,则需要传递地址指向函数的指针。
那就是{{3}}。
答案 2 :(得分:1)
在函数调用change(txt1);
中,txt1
按值传递。它被复制到函数p
的参数change
。这使pi
指向与txt1
指向的字符串相同的字符串。将新字符串分配给p1
时,p1
会更改为指向该字符串,txt1
指向前一个字符串。
这种情况与
非常相似char *s1 = "String";
char *s2 = s1; // Both s1 and s2 points to same string
s2 = "Another string" // Now s2 points to "Another string" while s1 pointing to "String".
除此之外,您的代码导致内存泄漏。它应该像
char *txt1=(char*)malloc(200*sizeof(char));
strcpy(txt1,"original");
答案 3 :(得分:1)
答案 4 :(得分:1)
这是我之前使用过的一个例子。假设以下两个函数:
foo
要使函数var
更新T
(类型为var
的对象)的内容,我们必须将指针传递给T *
(类型T
)
如果我们用指针类型P *
替换void foo( P **p )
{
*p = new_value(); // write new value to the thing p points to
}
void bar( void )
{
P *var;
foo( &var ); // write new value to var
}
,则上面的代码变为
foo
语义完全相同;我们希望var
将新值写入var
,因此我们将指针传递给var
。只是在这种情况下,foo
已经是指针类型,所以我们最终将指针传递给指针。
基本上,要var
更新&var
的内容,您必须传递表达式 p
作为参数,这意味着形式参数的类型var
将始终具有比Type of var Type of &var Type of p
----------- ------------ ---------
T T * T *
T * T ** T **
T ** T *** T ***
类型更多的间接级别。
user.Qualifications = new List<Qualification>();
等