Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “与”的区别是什么;char*var[3]”;及;字符变量[3][15]“;?_C++_Multidimensional Array - Fatal编程技术网

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:一定要对你认为有用的任何/所有答案投赞成票!