二维数组指针算法

时间:2014-08-21 00:44:52

标签: c++ c arrays pointers

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

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

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

中的元素

我首先尝试打印一些内容,以了解地址的工作原理。 我打印了arrarr+1arr+2以及arr+5的地址。

结果如下:

0x7fff58475b80
0x7fff58475b94
0x7fff58475ba8
0x7fff58475be4

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

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

  1. 在堆栈上分配指针arr
  2. arr指针将地址保存到指针数组的起始位置。
  3. 指针数组包含2-D数组中行的起始位置。
  4. 这是对的吗?

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

4 个答案:

答案 0 :(得分:4)

  

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

也许是因为在您的系统上,int的大小为4且内部数组中有5个整数。

要了解布局,请尝试以下代码:

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数组[dcl.arrays] ):

  

[注意:从这一切来看,C ++中的数组是按行存储的(最后一个下标变化最快)   声明中的第一个下标有助于确定阵列消耗的存储量但播放   下标计算中没有其他部分。 - 后注]

答案 1 :(得分:1)

2d矩阵中位置[i,j]的线性地址由下式计算:

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

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

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

将您的值插入上述等式中可以指示地址的差异。

答案 2 :(得分:1)

(1)arr [5] [5]的所有5 * 5个元素的存储器地址是&amp; arr [0] [0],&amp; arr [0] [1] ...&amp; arr [0] [4],&amp; arr [1] [0],...&amp; arr [1] [4],...&amp; arr [4] [4]。它们都按顺序排列,大小不同(int)。在你的os中,sizeof(int)= 4。

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

答案 3 :(得分:1)

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

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.

-No。在堆栈上分配指向整数(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.

现在是对的!但这是动态内存分配不是静态的!