【问题标题】:char** to cope with string?char** 来处理字符串?
【发布时间】:2012-10-27 07:03:58
【问题描述】:

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

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

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

【问题讨论】:

  • char ** 是必需的,因为您传入了需要更改的 char *
  • 这是一小部分类型安全,意外地潜入了 C :)。

标签: c string pointers char


【解决方案1】:

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**

【讨论】:

  • 那么如果我传递“char* endptr”并使用“endptr = 0x30160700”(例如),函数外“endptr”的实际值会保持不变?
  • @Rubby,没有。调用后endptr 会指向不同的位置。
  • @Rubby,如果参数是char* endptr,那么调用者将看不到对指针所做的任何更改。
【解决方案2】:

假设有一个名为 my_type 的类型,而您有一个名为 foo() 的函数,它需要一个指向 my_type 的指针,以便它可以修改它:

void foo(my_type *t);

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

typedef char* my_type;

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

my_type *t

应该是:

char **t

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2011-10-06
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多