在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的数据。