使用指针算术运算编写数组引用

3

让我们考虑以下代码片段:

#include<stdio.h>
main()
{
 int count[100][10];
 *(count + (44*10)+8)=99;
 printf("%d",count[44][8]);
}

它有什么问题?

不是答案:使用 int main() 会很好。 - Mohit Jain
count[44][8]= 99 . - UmNyobe
可能是为什么int*[]会衰减成int**而int[][]不会?的重复问题。 - ecatmur
3个回答

2
count[44][8]

未初始化的变量被调用并打印其值,这将导致未定义的行为。

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

如果你想初始化count [44] [8],那么可以这样做:

*(count[44] + 8) = 10; /* or *(*(count + 44) + 8) = 10 */
printf("%d",count[44][8]);

能否请您解释一下代码?a[i][j] = *(a[i] + j)是一个规则吗?a[i][j] = ((a+i) + j)用于访问2D数组。@Gopi - Black Swan
int count[100][10],*countP; countP = &count[0][0]; *(countP + 440 + 8) = 99; 这个片段没有运行成功。 - Black Swan
@BlackSwan - 这就是规则。任何数组都只是内存中的地址块。您可以使用普通的数组表示法 count[44][8] 或通过指定从计数的基地址开始的内存 offset 来寻址任何特定地址(例如 *(*(count + 44) + 8))。对于一维数组,基本等价关系更容易理解:a[i] = *(a + i)。对于二维数组,您只需要多一个层次:a[i][j] = *(*(a + i) + j) - David C. Rankin

2

我不熟悉C++,只熟悉C。它按你的方式工作了,但我仍然困惑为什么我必须进行强制转换...! - Black Swan
@BlackSwan 请参考Oliver Charlesworth的回答:https://dev59.com/_mYq5IYBdhLWcg3wzDrk#14183554 - 数组到指针的衰减在C和C++中的工作方式完全相同,只是C++提供了更多观察它的方法。 - ecatmur

1
"

*(count + (44*10)+8)=99; 应该是

"
*(count[0] + (44*10)+8)=99;

countp[0]的类型可以根据需要重新解释为int *

在此处输入实时代码

count的类型是int [100][10],因此向其添加一些大数会使其前进10倍,并且访问该位置将导致UB。

编写相同内容的另一种方法是:

*( *(count + 44) + 8 )=99;

1
最好能有一个解释。 - Ed Heal
@EdHeal 我不小心按下了某个键和回车键,导致回答在完成之前被提交了。我接受(+1 提醒)它是不完整的。 - Mohit Jain
你的答案现在完整了吗?@Mohit Jain - Black Swan
@BlackSwan 是的,现在已经完成了。 - Mohit Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接