我无法理解const的用法:
char* const args[];
这是否意味着参数不能指向一个新的地址? 它与以下不同:
const char* args[];
另外我想遍历这个列表,并使用一个for循环语句将值附加到一个string:
string t_command; for(char** t= args; (*t) != NULL ; t++ && t_command.append(*t + " ")) {}
我没有在这里做什么,我无法弄清楚什么。
char* const args[];
args
是一个数组。 数组中的每个元素都是一个指向char
的指针。 这些指针是const
。 您不能修改数组的元素来指向其他任何地方。 但是,您可以修改它们指向的char
。
const char* args[];
args
仍然是一个数组。 数组中的每个元素仍然是指向char
的指针。 但是,指针不是 const
。 您可以修改数组的元素以指向别处。 但是,您不能修改它们指向的char
。
图表时间:
Args: ┌───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ // In the first version, these pointers are const └─╂─┴─╂─┴─╂─┴─╂─┴─╂─┴─╂─┘ ┃ ┗━┓ ┗━┅ ┗━┅ ┗━┅ ┗━┅ ▼ ▼ ┌───┐ ┌───┐ │ c │ │ c │ // In the second version, these characters are const └───┘ └───┘
当你有一个指向字符的指针时,这些字符本身就是一个数组的一部分(一个C风格的字符串),在这种情况下,它看起来像这样:
Args: ┌───┬───┬───┬───┬───┬───┐ │ │ │ │ │ │ │ // In the first version, these pointers are const └─╂─┴─╂─┴─╂─┴─╂─┴─╂─┴─╂─┘ ┃ ┗━━━━━━━┓ ┗━┅ ┗━┅ ▼ ▼ ┌───┬───┬┄ ┌───┬───┬┄ │ c │ c │ │ c │ c │ // In the second version, these characters are const └───┴───┴┄ └───┴───┴┄
至于遍历数组,你试图将args
数组视为空终止。 这不是大多数数组的工作原理。 你应该迭代使用索引到数组中。
另外请注意,不能将数组和字符串一起添加(如*t ++ " "
)。 将一边转换为一个std::string
使其更容易。
所以如果N
是args
的大小:
for (size_t i = 0; i < N; i++) { t_command.append(std::string(args[i]) + " ")) }
char* const args[];
args
是一个char
的常量指针数组。 指针不能修改,但指向的东西可以。
const char* args[];
args
是一个指向const char
的数组。 指针可以修改,但是指向的东西不能。
如果你想要一个指向char* const args[];
的第一个元素的指针char* const args[];
,那么它的类型必须是一个指向常量指针的指针:
for (char * const * t = args; *t; ++t) { t_command.append(*t + " "); }