Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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++ c/c++;:二维数组变量下标_C++_C - Fatal编程技术网

C++ c/c++;:二维数组变量下标

C++ c/c++;:二维数组变量下标,c++,c,C++,C,输出:- int a[3][3]={5}; printf("&a = %u \n a = %u \n*a = %u\n&a[0][0]=%d\na[0][0]", &a, a, *a, &a[0][0], a[0][0]); 这些怎么都一样? 如果a的值=2359028,那么*a不应该在地址2359028处给出值,即5 &a提供数组的地址。它的类型是int(*)[3][3]。简单 a表示数组本身,并将进行数组到指针的转换,以成为指向数组第一个元素的指针。数组的第

输出:-

int a[3][3]={5};
printf("&a = %u \n a = %u \n*a = %u\n&a[0][0]=%d\na[0][0]", &a, a, *a, &a[0][0], a[0][0]);
这些怎么都一样? 如果a的值=2359028,那么
*a
不应该在地址2359028处给出值,即5

  • &a
    提供数组的地址。它的类型是
    int(*)[3][3]
    。简单

  • a
    表示数组本身,并将进行数组到指针的转换,以成为指向数组第一个元素的指针。数组的第一个元素是
    int[3]
    类型的子数组,因此我们得到一个指向该子数组的指针。此指针的类型为
    int(*)[3]
    。由于第一个子数组位于数组的开头,因此它的地址与以前相同

  • 使用
    *a
    ,数组再次进行数组到指针的转换,以获得与以前相同的指向子数组的指针。这就是解引用以获得子阵列本身。然后,这个表示子数组的表达式也会进行数组到指针的转换,为您提供指向其第一个元素的指针。第一个元素的类型为
    int
    ,因此指针的类型为
    int*
    。第一个元素的地址与它所属的子数组的地址相同,正如我们所看到的,子数组的地址与整个数组的地址相同

  • &a[0][0]
    首先获取第一个子数组的第一个元素,然后获取它的地址。这将为您提供与上一点完全相同的指针

  • 因此,所有这些指针都具有相同的值

    从图表上看:

    &a = 2359028
     a = 2359028
    *a = 2359028
    &a[0][0]=2359028
    a[0][0] =5
    
    这些区域都从相同的地址开始,因此指针具有相同的值

  • &a
    提供数组的地址。它的类型是
    int(*)[3][3]
    。简单

  • a
    表示数组本身,并将进行数组到指针的转换,以成为指向数组第一个元素的指针。数组的第一个元素是
    int[3]
    类型的子数组,因此我们得到一个指向该子数组的指针。此指针的类型为
    int(*)[3]
    。由于第一个子数组位于数组的开头,因此它的地址与以前相同

  • 使用
    *a
    ,数组再次进行数组到指针的转换,以获得与以前相同的指向子数组的指针。这就是解引用以获得子阵列本身。然后,这个表示子数组的表达式也会进行数组到指针的转换,为您提供指向其第一个元素的指针。第一个元素的类型为
    int
    ,因此指针的类型为
    int*
    。第一个元素的地址与它所属的子数组的地址相同,正如我们所看到的,子数组的地址与整个数组的地址相同

  • &a[0][0]
    首先获取第一个子数组的第一个元素,然后获取它的地址。这将为您提供与上一点完全相同的指针

  • 因此,所有这些指针都具有相同的值

    从图表上看:

    &a = 2359028
     a = 2359028
    *a = 2359028
    &a[0][0]=2359028
    a[0][0] =5
    

    这些区域都从相同的地址开始,因此指针具有相同的值。

    在C语言中,当一个数组包含在一个表达式中(例如,当传递给函数或指针算术时),它会隐式转换为指针。因为您正在将
    a
    传递给
    printf
    ,它被隐式转换为指向
    a
    的指针,这与
    &a
    相同


    您可能会对以下事实感到困惑:
    *a
    看起来像是相对于
    &a
    的双解引用,后者返回数组的地址,因此
    *a
    应该根据此逻辑得到
    a[0][0]
    。但事实并非如此。

    在C语言中,当一个数组包含在一个表达式中时(例如,当传递给函数或指针算法时),它会隐式转换为指针。因为您正在将
    a
    传递给
    printf
    ,它被隐式转换为指向
    a
    的指针,这与
    &a
    相同

    您可能会对以下事实感到困惑:
    *a
    看起来像是相对于
    &a
    的双解引用,后者返回数组的地址,因此
    *a
    应该根据此逻辑得到
    a[0][0]
    。但事实并非如此。

    “……不应该*在地址2359028即5处给出值吗?”

    是和否。
    *a
    确实应该给您地址
    a
    处的对象。但是,在您的情况下,
    a
    具有类型
    int[3][3]
    。这意味着在这个间接层次上,地址
    a
    处的对象(如果我们将
    a
    解释为指针)不是您错误地认为的
    5
    ,它实际上是整个1D数组
    a[0]
    *a
    的类型是
    int[3]
    ,存储在
    *a
    的值也是整个1D子数组
    a[0]

    因此,当您尝试
    printf
    *a
    时,实际上是将整个
    a[0]
    子数组指定为参数。该子数组衰减为指针,指针自然指向相同的位置(因为整个数组
    a
    及其第一个子数组
    a[0]
    在内存中具有相同的位置)。这就是为什么将
    a
    *a
    打印为指针(以及
    &a
    )会打印相同的数值

    在这种情况下,如果要访问
    5
    ,必须执行
    **a
    。仅仅
    *a
    是不够的。

    “…不应该*在地址2359028即5处给出值吗?”

    是和否。
    *a
    确实应该给您地址
    a
    处的对象。但是,在您的情况下,
    a
    具有类型
    int[3][3]
    。这意味着在这个间接层次上,地址
    a
    处的对象(如果我们将
    a
    解释为指针)不是您错误地认为的
    5
    ,它实际上是整个1D数组
    a[0]
    *a
    的类型是
    int[3]