-1

当我遇到char**时我很困惑,真的有必要处理字符串吗?
例如:

double strtod(const char *nptr,char **endptr);

如果endptr不为 NULL,则指向停止扫描的字符的指针存储在 指向的位置endptr。---MSDN
这很复杂,为什么不直接将指向字符的指针复制到endptr? 调用后的所有计算都可以通过将指针的值传递给endptr我的想法来实现。
真的char**需要吗?

4

2 回答 2

2

C 中的参数是按值传递的。如果您希望函数的调用者看到对传递给函数的参数所做的更改,则需要将参数的地址传递给函数。这就是为什么char**要通过。调用者有一个类型的变量char*并传递它的地址。如果它在函数中发生更改,调用者可以看到该更改。

例如:

void set_int(int i) { i = 4; }

/* Caller */
int x = 7;
set_int(x);
/* 'x' is still 7 */

void really_set_int(int* i) { *i = 4; }

/* Caller */
int x = 7;
really_set_int(&x);
/* 'x' is now 4 */

类型变量的相同行为char*。如果一个函数需要更改指向char*的内容(而不是它的内容),它需要类型为的 的地址。char*char**

于 2012-10-27T07:07:39.243 回答
0

想象有一个名为 的类型my_type,并且您有一个名为的函数foo(),它需要一个指向 a 的指针,my_type以便它可以修改它:

void foo(my_type *t);

现在,让我们看看my_type实际是如何定义的:

typedef char* my_type;

因此,类型是否已经是指针并不重要。如果你想传递一个指向该类型变量的指针,你需要它的地址。所以分解:

my_type *t

将会:

char **t

每当你想要一个指向类型变量的指针时char *,你都需要一个char **.

于 2012-10-27T07:11:46.963 回答