C / C ++中的二维字符数组

时间:2014-07-07 10:09:40

标签: c++ c arrays

之间有什么区别
char (CharBuff[50])[10];

char CharBuff[10][50];

我的要求是拥有10个字符的缓冲区,每个缓冲区的长度最大为50(包括空终止字符)

而且,我想以CharBuff [0],CharBuff [1]等方式访问缓冲区。

7 个答案:

答案 0 :(得分:2)

char (CharBuff[50])[10];

CharBuff声明为包含char的10元素数组的50元素数组。在这种情况下,括号是多余的。

char CharBuff[10][50];

CharBuff声明为包含char的50个元素数组的10元素数组。

鉴于您需要10个最多50个字符的字符串,您将使用第二个表单;每个CharBuff[i]的类型将是“char的50个元素数组”。

如果确实想要为char的50个元素数组创建单独的类型定义,您可以执行类似

的操作
typedef char Str[50];  
...
Str CharBuff[10];

现在CharBuff是一个10个元素的Str数组,它是一个50个元素的char数组。

通常,我不会创建这样的单独的typedef,除非我想让Str 不透明;也就是说,我不想将其实现的细节公开给任何使用它的人。除了typedef之外,我还提供了一个用于分配,分配,复制,格式化和显示Str类型对象的API。

换句话说,如果使用Str类型的人知道它是一个50个元素的char数组,以便正确使用它,那么最好让它们使用50个元素的char数组。

答案 1 :(得分:1)

这里的其他答案说它们是一样的都是错的!两者都是 NOT 相同的数组,它们的大小非常不同。这是一个显示:

的片段
char i[50][10];
std::cout << sizeof(i[1]) << '\n';

char (j[10])[50];
std::cout << sizeof(j[1]) << '\n';
  

10

     

50

您可以看到实时示例here

i是一个50个元素的数组,每个元素是一个10个元素的字符数组,而j是一个10个元素的数组,每个元素是一个50个元素的字符数组。虽然两者的总大小相同,但每个级别的元素大小会有所不同。如果你认为它们是相同的,那么就会导致未定义的行为

i[25][5]  // OK
j[25][5]  // accessing j beyond index 9 is undefined behaviour!

这表明括号在非指针非参考数组声明中没有意义,即char (j[10])[50]只是char j[10][50]的符号混淆。

  

我的要求是拥有10个字符的缓冲区,每个缓冲区长度为50

然后你应该将你的数组声明为char CharBuff[10][50]

答案 2 :(得分:0)

没有人使用前者,总是使用后者:

char CharBuff[10][50];

答案 3 :(得分:0)

根据您对每行长度为50行的10行(字符缓冲区)的要求,后一种语法将非常熟练且不那么令人困惑。

答案 4 :(得分:0)

选择最后一个,因为它清楚地说明了你要分配的内容 不过,由于此问题也标有c++,因此我建议您使用std::vectorstd::string

std::vector<std::string> CharBuff(10, std::string(50, '\0'));

答案 5 :(得分:0)

我在这里看到的一个大问题是语法混乱。当你使用括号时,他们已经在c和c ++语法中有已知的角色,比如类型转换,指向函数的指针(看起来有点像你写的那样)。你正在使用它们添加一个新的含义,使代码更加混淆,并忽略了这样一个事实:对于任何使用矩阵至少一次的人来说,c和c ++都有一种非常直观的方式来表达2d数组。因此,对于干净且不混淆的语法,请使用后一版本:

char CharBuff[10][50];

答案 6 :(得分:-1)

您正在寻找10个阵列,每个50个字符。

要声明一个50字节的缓冲区,您可以使用

  

char CharBuff [50];

但是你想拥有10个缓冲区,所以只需要在[50]之前加以解决,例如:

  

char CharBuff [10] [50];

现在CharBuff [0]将寻址第一个50字节缓冲区,CharBuff [1]将获得第二个缓冲区,依此类推。