之间有什么区别
char (CharBuff[50])[10];
和
char CharBuff[10][50];
我的要求是拥有10个字符的缓冲区,每个缓冲区的长度最大为50(包括空终止字符)
而且,我想以CharBuff [0],CharBuff [1]等方式访问缓冲区。
答案 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::vector
和std::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]将获得第二个缓冲区,依此类推。