【问题标题】:difference between char str[m][n] and char *str[] when passing to function传递给函数时 char str[m][n] 和 char *str[] 之间的区别
【发布时间】:2015-04-28 13:29:51
【问题描述】:
 1. char *names[5]={"Web","Security","Software","Hello","Language"};

 2. char names[5][30]={"Web","Security","Software","Hello","Language"};

这两者有什么区别?

我知道的是(1.)第一个可以有所需长度的字符串,而(2.)第二个可以有 29 个字符的字符串,带有 '\0'

但我很困惑,将它们传递给函数以及如何传递它们有什么区别?

请详细说明我是 C++ 新手 ....

【问题讨论】:

  • 第一个没有编译,因为字符串文字是const
  • 第一个分配5 * sizeof(char*) 字节并在每个索引处存储一个指针,而第二个分配5 * 30 字节并将您的字符串保存在那里。附言那是 C。
  • 警告:不推荐将字符串常量转换为 'char*' [-Wwrite-strings]|它编译了,但有这个警告,你能解释一下昆汀吗
  • C++ 标准不允许指向没有 const 的字符串字面量。 stackoverflow.com/questions/14570993/…
  • @CodeLearner 这是与旧 C 标准的剩余兼容性规则,它没有 const。在任何情况下,都禁止修改字符串文字(并且通常会崩溃),因此最好将其声明为 const 并让编译器发现任何误用。

标签: c++ string char


【解决方案1】:

除非您添加const,否则第一个不应编译; const char *names[5] = ....

一旦你解决了这个问题,第一个是指针数组,第二个是数组数组。

如果将它们传递给函数,第一个将衰减为指向指针 const char** 的指针,而第二个将衰减为指向具有 30 个元素的数组的指针 char(*)[30]

也就是说,

void pointers(const char**);
void arrays(char(*)[30]);

const char *names[5]={"Web","Security","Software","Hello","Language"};
pointers(names); // Good
arrays(names); // Bad

char names[5][30]={"Web","Security","Software","Hello","Language"};
pointers(names); // Bad
arrays(names); // Good

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2021-08-07
    • 2022-06-15
    • 1970-01-01
    • 2018-06-27
    • 2015-10-06
    • 2019-04-27
    相关资源
    最近更新 更多