C中的二维数组和指针 - 如何访问元素?

sha*_*ols 6 c pointers

我有一个涉及指向2D数组的指针的示例.有人可以帮我理解这个例子中发生了什么吗?

int main()
{

    int i = 0, j=0, sum0=0, sum1=0;
    int data[4][3] = { {23,55,50},{45,38,55},{70,43,45},{34,46,60}};
    int *Ptr;
    Ptr = *data;    //Why is the indirection operator used here? 
                    // Does Ptr = 23 by this assignment?

    for (i=0; i<4; i++) {
        sum1 = 0;
        for (j = 0; j < 3; j++) {
            sum1 += data[i][j];
        }
        if (sum1 > sum0) {
                 sum0 = sum1;
                 Ptr = *(data + i);     // Seems like this statement makes Ptr
        }                               // point one row below ... what syntax
    }                                   // can you use to access columns then?
                                       // Is it possible to use pointer arithmetic
    for (i=0; i<3; i++)                 // to access elements of data[i][j] that
        printf("%d\n", Ptr[i]);          // are not at j = 0?

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

ras*_*hok 14

data 是一个2维数组,有4行,每行有3个元素(即4 X 3).

现在,Ptr = *data;意味着您将第一行的起始地址存储到指针变量Ptr.这个陈述相当于Ptr = *(data + 0).Ptr = *(data + 1) - 这意味着我们正在分配第二行的起始地址.

然后*Ptr*(Ptr + 0)将给出指向的行的第一个元素的值.同样,*(Ptr + 1)将为您提供行的第二个元素的值.

for程序中的循环用于标识哪一行具有其元素总和的最大值(3个元素).一旦控件从该for循环中出来,Ptr将指向具有其元素的最大总和的行,并且sum0将具有该总和的值.

考虑一个数组int a[5];,我希望你知道a[0]并且0[a]是一样的.这是因为a[0]手段*(a+0)0[a]手段*(0 + a).这种相同的逻辑可用于二维阵列.

data[i][j]类似于*(*(data + i) + j).我们也可以写它i[data][j].

有关更多详细信息,请参阅yashwant kanetkar中的"理解c中的指针"一书.


小智 7

Ptr = *data;*(data+0)+0第一行的第一列元素的指针的缩写.添加数据的第一个0是行号,它是间接的并将我们带到第一行.* (data+0)仍然是一个地址,而不是它指向的值(对于2D数组).因此,Ptr现在指向第一行中第一列的地址.第二个零是列号.因此,选择第一行和第一列的存储器地址.再次使用间接(*)只会给出地址所拥有的值.喜欢* (*(data+0)+0)**data.

通常,如果p是指针名称,i行号和j列号,

  1. (*(p+i)+j)将给出2D数组中元素的内存地址.我排不了.和j是col no.,
  2. *(*(p+i)+j) 会给出该元素的价值.
  3. *(p+i) 将访问第i行
  4. 要访问列,请添加列号*(p+i).您可能必须将指针声明为(*p)[columns]而不仅仅是*p.这样做,您将声明指向2D数组的指针.

使用指针运算是像二维数组一样处理二维数组.将指针*Ptr初始化为第一个元素(int *Ptr = *data),然后添加一个no.(Ptr + n)访问列.添加高于列号的数字只会继续计算下一行第一列中的元素(如果存在).