[英]Passing pointer argument by reference under C?
#include <stdio.h>
#include <stdlib.h>
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 <cstring>
我可以用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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.