Array中的指针语法用法

时间:2015-01-13 10:06:35

标签: c++ c arrays pointers

我对使用二维数组的上下文中的指针语法用法有一些问题,虽然我对1-D数组符号和指针感到满意,下面是语法之一,我无法理解下面的表达式是怎样的评价。

要访问存储在数组 a 第三行第二列中的元素,我们将使用下标表示法 a [2] [1] 访问同一元素的其他方式是

*(a[2]+1)

如果我们想用它作为指针,我们会这样做

*(*(a+2)+1)

虽然我能理解*(a[2]+1)的替换 作为*(*(a+2)+1),但我不知道如何评估。 如果可能,请举例说明。 假设数组按行顺序存储并包含以下元素

int a[5][2]={
               21,22,
               31,32
               41,42,
               51,52,
               61,62
             };

和数组的基址是 100(只是假设)所以 a [2] 的地址是 108(int = 2的大小(另一个假设) ))所以表达式*(*(a+2)+1). How does it gets evaluated does it start from the inside bracket and if it does then after the first bracket we have the value to which 1 is being added rather than the address... :/

2 个答案:

答案 0 :(得分:4)

开始使用

a[i] = *(a+i);

所以

a[i][j] = *(a[i] +j)

a[i][j] = *(*(a+i) + j) 
  

a [i] = *(a + i):

如果a是数组,那么数组的起始地址由&a[0]a

提供

所以当你指定

a[i]这会衰减到指针操作*(a+i),从位置a开始,取消引用指针以获取存储在该位置的值。

如果内存位置为a,则存储在其中的值由*a给出。

类似地,数组中下一个元素的地址由

给出
&a[1] = (a+1); /* Array decays to a pointer */

现在存储元素的位置由&a[1](a+1)指定,因此存储在该位置的值由*(&a[1])*(a+1)

提供

例如:

int a[3];

它们存储在内存中,如下所示:

  a    a+1   a+2
------------------
| 100 | 102 | 104| 
------------------
 &a[0] &a[1] &a[2]

现在a指向数组的第一个元素。如果您知道指针操作a+1将为您提供下一个位置,依此类推。

在2D数组中,下面是访问的内容:

int arr[m][n];



  arr:
        will be pointer to first sub array, not the first element of first sub 
        array, according to relationship of array & pointer, it also represent 
        the array itself,

    arr+1:
        will be pointer to second sub array, not the second element of first sub 
        array,

    *(arr+1):
        will be pointer to first element of second sub array,
        according to relationship of array & pointer, it also represent second
        sub array, same as arr[1],

    *(arr+1)+2:
        will be pointer to third element of second sub array,

    *(*(arr+1)+2):
        will get value of third element of second sub array,
        same as arr[1][2],

答案 1 :(得分:4)

2D数组实际上是一块连续的内存。让我举一个例子:int a[3][4]在内存中由12个整数的唯一序列表示:

a00 a01 a02 a03 a04 a10 a11 a12 a13 a14 a20 a21 a22 a23 a24
|                   |                   |
first row           second row          third row

(当然它可以扩展到任何多维数组)

aint[4]的数组:它衰减指向int[4]的指针(事实上,它衰减为&(a[0]))< / p>

a[1]排在第二位。它衰减指向第一行开头的int *

即使数组不是指针,它们衰减到指针的事实允许在指针算术中使用它们:a + 1是指向数组a的第二个元素的指针。

所有这些都解释了为什么a[1] == *(a + 1)

相同的推理可以应用于a[i] == *(a+i),并从那里应用到您问题中的所有表达式。

让我们具体看*(*(a+2)+1)。如上所述,a + 2是指向int 4数组的第三个元素的指针。因此*(a + 2)是第三行,是一个int[4]的数组,并衰减为int *&(a[2][0])

*(a + 2)衰减到int *时,我们仍然可以将它用作指针算术的基础,*(a + 2) + 1是指向第三行第二个元素的指针:{{1} }。只需取消引用所有内容即可获得

*(a + 2) + 1 == &(a[2][1])