char * const args []定义

时间:2013-03-22 17:18:13

标签: c++ c linux const

我无法理解const的用法:

char* const args[]; 

这是否意味着args无法指向新地址?它与以下有什么不同:

const char* args[];

此外,我正在尝试遍历此列表并使用单个for循环语句将值附加到字符串:

string t_command;
for(char** t= args; (*t) != NULL ; t++ && t_command.append(*t + " ")) {}

我没有在这里做点什么,我无法弄清楚是什么。

2 个答案:

答案 0 :(得分:11)

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数组视为以null结尾。这不是大多数数组的工作方式。您应该使用索引迭代到数组中。

另请注意,您无法将数组和字符串文字一起添加(如*t ++ " "中所示)。将一侧转换为std::string以使其更容易。

因此,如果N的大小为args

for (size_t i = 0; i < N; i++) {
  t_command.append(std::string(args[i]) + " "))
}

答案 1 :(得分:2)

char* const args[];

args是一个指向char的常量指针数组。指针不能被修改,但它们指向的东西可以。

const char* args[];

args是指向const char的指针数组。指针可以被修改,但它们指向的东西不能。

如果你想要一个指向char* const args[];的第一个元素的指针,那么它的类型必须是一个指向常量指针的指针:

for (char * const * t = args; *t; ++t) {
    t_command.append(*t + " ");
}