繁体   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