双指针变量没用吗? [关闭]

问题描述 投票:0回答:2

当我可以简单地

void**
到原始变量时,为什么我应该创建一个新的
&
变量? 双指针变量没用吗?

请注意 我不是在讨论

double-pointer
概念。我说的是创建双指针变量而不是仅仅使用引用。我是关于编码风格,而不是概念。

void update(char** foo) {
    char* buf = (char*) malloc(32);
    sprintf(buf, "Hello World");
    *foo = buf;
}

int main() {
    
    char* foo = NULL;
    
    // Using a char** variable (The long way)
    char** bar = &foo;
    update(bar);
    printf("Using a new variable -> foo = %s.\n", *bar);
    
    // Using reference (The quick way)
    update(&foo);
    printf("Using a simple reference -> foo = %s.", foo);

    return 0;
}
c pointers double-pointer
2个回答
1
投票

他们不是没用。一般来说,您无法避免创建双指针变量。但是你可以避免存储计算的中间结果。

您的程序包含这两个示例。让我们详细看看每一个。


char** foo

你无法替代

void update(char** foo) {
    char* buf = (char*) malloc(32);
    sprintf(buf, "Hello World");
    *foo = buf;
}

void update(char* foo) {
    char* buf = (char*) malloc(32);
    sprintf(buf, "Hello World");
    foo = buf;           // XXX Uselessly modifies the local variable `foo`.
}

这里需要创建一个双指针变量


char** bar

然而,

char** bar = &foo;
update(bar);

确实可以简化为

update(&foo);

这里不需要创建变量,因为不需要存储计算的中间结果。当我们简化时,我们做同样的事情

int sum = a + b;
int result = sum * c;

进入

int result = ( a + b ) * c;

0
投票

当您开始解决更复杂的编程问题时,您将需要它们。

例子:

typedef struct text
{
    size_t nlines;
    char **lines;
}text_t;


text_t *addline(text_t *lines, const char *str)
{
    if(lines)
    {
        char **tmp = realloc(lines -> lines, sizeof(*lines -> lines) * (lines -> nlines + 1));
        if(tmp)
        {
            lines -> lines = tmp;
            lines -> lines[lines -> nlines] = malloc(strlen(str + 1));
            if(lines -> lines[lines -> nlines])
            {
                strcpy(lines -> lines[lines -> nlines], str);
                lines -> nlines += 1;
            }
        }       
    }
    return lines;
}
© www.soinside.com 2019 - 2024. All rights reserved.