char **应对字符串?

时间:2012-10-27 07:03:59

标签: c string pointers char

当我遇到char **时,我很困惑,是否真的有必要应对字符串?
例如:

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

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

2 个答案:

答案 0 :(得分: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**

答案 1 :(得分:0)

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

void foo(my_type *t);

现在,让我们看一下my_type实际定义的方式:

typedef char* my_type;

因此,类型是否已经是指针并不重要。如果要将指针传递给该类型的变量,则需要其地址。所以分解:

my_type *t

将是:

char **t

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