让我们考虑以下代码片段:
#include<stdio.h>
main()
{
int count[100][10];
*(count + (44*10)+8)=99;
printf("%d",count[44][8]);
}
它有什么问题?
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]);
count[44][8]
或通过指定从计数的基地址开始的内存 offset
来寻址任何特定地址(例如 *(*(count + 44) + 8)
)。对于一维数组,基本等价关系更容易理解:a[i] = *(a + i)
。对于二维数组,您只需要多一个层次:a[i][j] = *(*(a + i) + j)
。 - David C. Rankin数组指针衰减仅适用于一级; 因此,int count [100] [10];
衰减为 int (*)[100]
(为什么 int*[] 变成 int** 衰减而 int[][] 不是?).
您可以将 count
强制转换为 int*
或使用 &count [0] [0]
获取 2D 数组的第一个元素的 int*
指针。
*(count + (44*10)+8)=99;
应该是
*(count[0] + (44*10)+8)=99;
countp[0]
的类型可以根据需要重新解释为int *
。
count
的类型是int [100][10]
,因此向其添加一些大数会使其前进10倍,并且访问该位置将导致UB。
编写相同内容的另一种方法是:
*( *(count + 44) + 8 )=99;
int main()
会很好。 - Mohit Jaincount[44][8]= 99
. - UmNyobe