为什么这会超过价值?

时间:2016-06-05 13:57:24

标签: c pointers pass-by-reference pass-by-value

我试图理解传递值和传递参考之间的区别,我认为我终于明白了,直到我看到这段代码:

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);

}

是不是通过了地址?然后改变它并指向其他地方?

输出结果为:

  

之前:原创

     

之后:原创

为什么?

5 个答案:

答案 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)

按引用传递和传递值。 Pass By Reference and Pass By value.

答案 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>();

相关问题