|
发表于 2024-9-4 14:34:30
From FishC Mobile
|
显示全部楼层
|阅读模式
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<stdio.h>
#define ROW 3
#define COL 4
int main()
{
int i, j;
int mat[ROW][COL]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
for(i = 0;i < ROW*COL;i++)
{
printf("%d\t",*(*mat +i ));
if((i + 1) % 4 == 0)
printf("\n");
}
return 0;
}
printf("%d\t",*(*mat +i )); 这一行代码,*mat取第一个数组元素,为什么可以跟i想加形成地址偏移
在你的代码中,`mat` 被定义为一个二维数组,其在内存中的排布是连续的。首先,让我们来看一下 `*(*mat + i)` 的具体含义:
1. `mat` 是一个 3x4 的二维数组,该数组在内存中存储时会展开为连续的一维数组形式,即 `{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}`。
2. `*mat` 实际上是等同于 `mat[0]`,也就是指向二维数组第一行(即 `mat[0]`)的指针。因为 `mat[0]` 本身就是一个一维数组,它的类型是 `int[4]`,所以 `*mat` 就是 `&mat[0][0]`,即指向第一个元素的指针。
3. `*mat + i` 相当于 `&mat[0][0] + i`,这意味着它指向内存中从 `mat[0][0]` 开始偏移 `i` 个整数位置的地址。
4. `*(*mat + i)` 进一步解引用这个结果,获取到从 `mat[0][0]` 开始偏移 `i` 后的那个具体整数值。因此,当你在循环中让 `i` 从 0 递增到 `ROW*COL-1`,你依次访问 `mat` 中的每一个元素。
结果是,这段代码将以行优先顺序打印出二维数组中的每一个元素。在 C 中,二维数组的这种线性存储方式可以让我们通过指针计算方便地访问元素。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|