【问题标题】:char* const args[] definition [duplicate]char* const args[] 定义 [重复]
【发布时间】:2013-03-12 15:51:32
【问题描述】:

我在这里无法理解 const 的用法:

char* const args[]; 

这是否意味着 args 不能指向新地址?与以下有何不同:

const char* args[];

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

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

我没有在这里做某事,我不知道是什么。

【问题讨论】:

  • 在 Stack Overflow 上,关于const 在 C/C++ 中的含义的问题几乎是无限的。发帖前请使用搜索工具...
  • 表示 const 指针数组,指向 char。你不能改变它们。你的循环是错误的。
  • 还有http://cdecl.org可以帮助你。
  • 感谢 cmets。我清楚地理解 char* const 和 const char* 。这里的问题与双指针常量有关。
  • 你应该从右到左读取指针,第一个是“指向一个字符的常量指针”,第二个是“指向一个常量的字符的指针”

标签: c++ c linux constants


【解决方案1】:
char* const args[]; 

args 是一个数组。数组中的每个元素都是指向char 的指针。这些指针是const。您不能修改数组的元素以指向其他任何地方。但是,您可以修改他们指向的chars。

const char* args[]; 

args 仍然是一个数组。数组中的每个元素仍然是指向char 的指针。但是,指针不是const。您可以修改数组的元素以指向其他地方。但是,您不能修改他们指向的chars。

出图时间:

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 以使其更容易。

所以如果Nargs 的大小:

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 + " ");
}

【讨论】:

    猜你喜欢
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2018-05-24
    • 2020-09-04
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多