C++ “与”的区别是什么;char*var[3]”;及;字符变量[3][15]“;?
我对以下两种方式感到困惑:C++ “与”的区别是什么;char*var[3]”;及;字符变量[3][15]“;?,c++,multidimensional-array,C++,Multidimensional Array,我对以下两种方式感到困惑: char var[3][15] = {"Hello_world!", "good", "bad"}; // as known this is for an 2D array. char *var[3] = {"Hello_world!", "good", "bad"}; // and this I think also 2D array, but how. 它们之间有什么区别? 什么情况下可以使用这个或那个? 第一种是二维数组 [0] -> "Hello_
char var[3][15] = {"Hello_world!", "good", "bad"}; // as known this is for an 2D array.
char *var[3] = {"Hello_world!", "good", "bad"}; // and this I think also 2D array, but how.
第一种是二维数组
[0] -> "Hello_world!"
[1] --------------------------------->"good"
[2] ---------------------->"bad"
第二个是指针的一维数组。如果这些指针指向数组,那么它也将是一个二维数组,但仅仅通过查看类型并不能保证这一点
例如,您可以有一个包含5个NULL
指针的数组:
char *var[5] = {0, 0, 0, 0, 0};
在这种情况下,它肯定不是二维数组,尝试访问
var[i][j]
将导致未定义的行为(很可能是内存访问错误或“segfault”)。第一个是字符的二维数组。
第二个是一个一维的char*(指针)数组。有两种类型的二维数组,两种类型都有 对于第一个,它是由5个
char[15]
对象组成的数组,这些对象在内存中按顺序排列。每个“行”末尾未使用的字节(在您的特定情况下,但并不总是)用零填充。这是大多数人在说“二维数组”时的想法,但有些人称之为“正方形”数组以区别于其他类型。初始化时,字符串文字将直接复制到数组中
[0][ 0] = 'H'
[0][ 1] = 'e'
...
[0][14] = '\0' (end of each row is filled with zeros)
[1][ 0] = 'G'
[1][ 1] = 'o'
...
[3][13] = '\0' (end of each row is filled with zeros)
[3][14] = '\0' (end of each row is filled with zeros)
第二个是一个由5个char*
(指针)组成的数组,它通常指的是一个大小不一定相同的char
对象数组。如果它们指向char对象的数组,则可以作为二维数组访问。由于每个数组的长度可能是不同的大小,这被称为“锯齿数组”。在代码中,有三行,第一行长13个字符,第二行长5个字符,第三行长4个字符。数组的第一个索引在内存中是连续的,但构成“内部”索引的数组可以在内存中的任何位置。当您初始化它时,它将形成一个指向实际字符串文本的一维数组。它们一起构成一个二维阵列
[0] -> "Hello_world!"
[1] --------------------------------->"good"
[2] ---------------------->"bad"
第一种方法实际上是在内存中创建一个45(3*15)字节的块,在某个内存位置有一个称为
var
的基。C将允许您将它们作为二维数组进行处理,这样var[a][b]
与*(var+a*15+b)
相同。然后,编译器将在正确的位置用字符串预填充这45个字节,以保持2D数组的感觉
第二种方法是用3个指针分配一块内存。如果指针每个为8字节,则var
是一个由24(3*8)字节组成的1D数组。此外,C将使用您的数据字符串在内存中的其他地方创建一些其他数组。然后将前者指向后者。也就是说,以下方法大致相当于您的第二种方法:
char s1[] = "Hello_world!";
char s2[] = "good";
char s3[] = "bad";
char *var[3] = { &(s1[0]), &(s2[0]), &(s3[0]) };
然而,请注意,
var[a][b]=*(var+a*15+b)
的第一种方法的等效性没有得到保持。例如,var[0]
将指向s1
,从技术上讲,它可以位于内存中的任何位置(与s2
或s3
的位置无关)。然后var[0][b]
是该位置的偏移量。这是一维数组char*s[3]={“Hello\u world!”,“good”,“bad”}代码>是的,它是一个一维字符串数组。然而,字符串本身是数组,所以在某种意义上它也是一个二维数组。请记住,二维数组只是数组的数组。。。不会编译,它必须是代码> const char *var(3)=<代码>…我使用的是代码> VisualStudio 2010 < /C>,并且编译没有问题。至少应该有一个警告,这是危险的,所以C++最近违背了规则。但显然微软忽略了这一点。Visual C++做了很多有趣的事情。@ LyGung:我试着改写它,希望下面的图表有助于解释事情。很好的解释。现在我明白了,谢谢你,祝你好运。@LionKing:一定要对你认为有用的任何/所有答案投赞成票!