我有一个涉及指向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列号,
(*(p+i)+j)将给出2D数组中元素的内存地址.我排不了.和j是col no.,*(*(p+i)+j) 会给出该元素的价值.*(p+i) 将访问第i行*(p+i).您可能必须将指针声明为(*p)[columns]而不仅仅是*p.这样做,您将声明指向2D数组的指针.使用指针运算是像二维数组一样处理二维数组.将指针*Ptr初始化为第一个元素(int *Ptr = *data),然后添加一个no.(Ptr + n)访问列.添加高于列号的数字只会继续计算下一行第一列中的元素(如果存在).