簡體   English   中英

在C下通過引用傳遞指針參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM