二维数组指针算术

2D array pointer arithmetic

本文关键字:指针 二维数组      更新时间:2023-10-16

假设我有一个int数组:int arr[5][5],并假设使用C语言进行内存管理。

我想只使用指针算术和解引用来访问数组的特定元素。

假设我想访问:arr[i][j]

中的元素

一开始我试着打印一些东西来理解地址是如何工作的。我打印了arrarr+1arr+2arr+5的地址。

结果如下:

0x7fff58475b80
0x7fff58475b94
0x7fff58475ba8
0x7fff58475be4

我想知道为什么每个地址之间的差异是14(十六进制)或20(十进制)。

另外,当你在堆栈上创建一个二维数组时,是一个指向内存块指针数组的指针吗?我假设我们是这样为数组分配空间的:

    在栈上分配一个指针arrarr指针保存着指针数组起始位置的地址。
  1. 指针数组包含了二维数组中每一行的起始位置。

正确吗?

编辑:另外,假设您想通过指针算术访问arr[i][j]。如何做到这一点呢?如果数组是动态分配的,我认为你可以做*(*(arr+ I)+j)。我不确定静态分配是如何做到这一点的?我猜是*(arr + ((row_size *(i))+j)))。这是正确的吗?

我想知道为什么每个地址之间的差异是14(十六进制)或20(十进制)。

可能是因为在您的系统中,int的大小是4,而内部数组中有5 int。

要了解布局的概念,请尝试以下代码:
int a[5][5];
int k = 0;
for (int i = 0; i < 5; i++)
    for (int j = 0; j < 5; j++)
        a[i][j] = ++k;
int* p = &a[0][0];
for (int n = 0; n < 25; n++, p++)
    printf("%d ", *p);

输出
1 2 3 4 ... 25

C++标准中有一个注释(在8.3.4 Arrays [dcl.arrays]):

[注:由此可见,c++中的数组是按行存储的(最后一个下标变化最快)声明中的第一个下标有助于确定数组所消耗的存储空间下标计算中没有其他部分。-end note]

二维矩阵中位置[i,j]的线性地址计算公式为:

linear_position = i * (capacity of column 0) + j;

使用数组类型的大小和数组的起始地址从线性位置计算地址:

cell_address = &array[0][0] + linear_position * sizeof(array[0][0]);

把你的值代入上述方程,你就会得到地址差异的指示。

(1) arr[5][5]的所有5*5元素的内存地址为&arr[0][0], &arr[0][1]…,Arr [0][4], & Arr[1][0],…所以,arr[1][4],…所以,arr[4][4]。它们都按顺序排列,不同的是sizeof (int)。在你的操作系统中,sizeof (int) = 4。

(2)从地址的角度来看,Arr +1 = & Arr [1][0], Arr +2 = & Arr[2][0]。它们只是不同的表示。前者是指针形式,后者是数组形式。

数组是存储在连续内存位置的相似数据元素的集合。

int arr[5][5];

在此声明中,它将为所有元素分配连续的内存位置。假设起始内存位置为1000。

array  starting   array elements
       address
arr[0]--> 1000 --> arr[0][0] arr[0][1] ... arr[0][4]
arr[1]--> 1020 --> arr[1][0] arr[1][1] ... arr[1][4]
arr[2]--> 1040 --> arr[2][0] arr[2][1] ... arr[2][4]
arr[3]--> 1060 --> arr[3][0] arr[3][1] ... arr[3][4]
arr[4]--> 1080 --> arr[4][0] arr[4][1] ... arr[4][4]

I'm wondering why the difference between each of address is 14(in Hexadecimal) or 20 (in decimal).

每个数组有5个整数,sizeof(int)为4。所以对于5个整数,它将分配20字节的内存。因此,只有你得到每个数组地址之间的差异是20字节(十进制)。在十六进制中是14)


1. Allocate a pointer `arr` on stack.

-不。在栈上分配一个指向整数(arr)的指针。这是int **arr;

2. The arr pointer holds the address to the starting location of an array of pointers.
3. That array of pointers contains the starting location of a row in the 2-D array.

现在是正确的!但这是动态内存分配,而不是静态的!