在C下通过引用传递指针参数?

#include  #include  void getstr(char *&retstr) { char *tmp = (char *)malloc(25); strcpy(tmp, "hello,world"); retstr = tmp; } int main(void) { char *retstr; getstr(retstr); printf("%s\n", retstr); return 0; } 

gcc不会编译这个文件,但是在添加#include 我可以使用g ++来编译这个源文件。

问题是:C编程语言是否支持通过引用传递指针参数? 如果没有,为什么?

谢谢。

不,C不支持引用。 这是设计的。 您可以使用指向C中的指针而不是引用。引用仅在C ++语言中可用。

引用是C ++的一个特性,而C只支持指针。 要让函数修改给定指针的值,请将指针传递给指针:

 void getstr(char ** retstr) { char *tmp = (char *)malloc(25); strcpy(tmp, "hello,world"); *retstr = tmp; } int main(void) { char *retstr; getstr(&retstr); printf("%s\n", retstr); // Don't forget to free the malloc'd memory free(retstr); return 0; } 

试试这个:

 void getstr(char **retstr) { char *tmp = (char *)malloc(25); strcpy(tmp, "hello,world"); *retstr = tmp; } int main(void) { char *retstr; getstr(&retstr); printf("%s\n", retstr); return 0; } 

这应该是一个评论,但它对于评论框来说太长了,所以我正在制作CW。

您提供的代码可以更好地编写为:

 #include  #include  #include  void getstr(char **retstr) { *retstr = malloc(25); if ( *retstr ) { strcpy(*retstr, "hello,world"); } return; } int main(void) { char *retstr; getstr(&retstr); if ( retstr ) { printf("%s\n", retstr); } return 0; } 

libgmp中有一个有趣的技巧,可以模拟引用: typedef mpz_t __mpz_struct[1];

然后你可以像这样写:

 mpz_t n; mpz_init(n); ... mpz_clear(n); 

我不建议使用这种方法,因为它可能对其他人来说是不可理解的,它仍然不能防止成为NULL: mpz_init((void *)NULL) ,并且它与指针到指针的对应部分一样冗长。

C lang没有引用变量,但它是C ++ lang的一部分。

引入引用的原因是为了避免悬空指针和指针无效的预检查。

您可以将引用视为常量指针,即const指针只能指向已初始化为point的数据。