当我可以简单地
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;
}
他们不是没用。一般来说,您无法避免创建双指针变量。但是你可以避免存储计算的中间结果。
您的程序包含这两个示例。让我们详细看看每一个。
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;
当您开始解决更复杂的编程问题时,您将需要它们。
例子:
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;
}