指针具有二维数组

Viv*_*ran 3 c arrays pointers multidimensional-array

请考虑以下代码

#include <stdio.h>
#define ROW_SIZE 2
#define COL_SIZE 2

int main()
{
   int a[ROW_SIZE][COL_SIZE]={{1,2},{3,4}};

   // Base address:Pointer to the first element a 1D array
   printf("Base address of array:%p\n",a);

   //The value at the base address: should be the address of 1st 1D array
   printf("Value at the Base address:%p\n",*a);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

获得的产出:

Sample Output:
Base address of array:0xbff77434
Value at the Base address:0xbff77434
Run Code Online (Sandbox Code Playgroud)

不知何故,我无法理解2D数组的基地址的概念和基地址的值,该地址是1D数组的地址相同.请解释.

Viv*_*ran 7

重新构建问题中的图表并合并先前答案中的信息,我创建了以下答案.

数组和指针

一维数组

  • 考虑一个4个整数的数组a a[4]
  • 基本规则是a并且&a将指向相同的位置.但它们指向相同的类型.
  • &a将指向整个数组int[].指针类型是int(*)[]
  • a当它衰减到指针时,将指向数组的第一个元素int.指针类型是int *

二维数组

  • 考虑一个包含两个1D数组的数组,每个数组都有两个元素; a[2][2].
  • 由于维度的数量增加,我们还有一个层次结构,即&a,a并且*a将指向相同的位置,但它们指向相同的类型.
  • &a将指向整个数组int[][].指针类型是int(*)[][].
  • a当它衰减到指针时,将指向2D数组的第一个元素int[].指针类型是int(*)[]
  • 通过使用*a,我们将指向一维数组的指针.因此,我们将int *指向2D数组的第一个整数值.


Car*_*rum 6

数组不是指针,在C中,多维数组只是一个数组数组.在许多上下文中,使用数组的名称"衰减"为指向该数组的第一个元素的指针.这就是两个打印语句中发生的情况.在第一种情况下:

printf("Base address of array:%p\n",a);
Run Code Online (Sandbox Code Playgroud)

a成为指向数组第一个元素的指针 - 也就是指向数组第一行的指针.在你的情况下,这意味着你得到一个类型的指针int (*)[2].

在第二种情况:

printf("Value at the Base address:%p\n",*a);
Run Code Online (Sandbox Code Playgroud)

同样的衰变发生了,但是你取消引用那个指针.这意味着您取消引用int (*)[2]指向第一行的指针,再次为您留下一个数组(第一行).该数组本身衰减为指向第一个元素的指针,为您提供结果int *指针(指向第一行的第一个元素).

在这两种情况下,地址都是相同的,因为这就是数组在内存中的布局方式.如果我们说你的2D数组从地址开始0,它看起来像这样(假设一个4字节的int类型):

 Address       Value
    0            1
    4            2
    8            3
   12            4
Run Code Online (Sandbox Code Playgroud)

第一行的地址和第一行的第一个元素的地址都是0.