鱼C论坛

 找回密码
 立即注册
查看: 511|回复: 2

[已解决]取值运算符疑惑

[复制链接]
发表于 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想加形成地址偏移
最佳答案
2024-9-4 14:34:41
在你的代码中,`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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-9-4 14:34:41 | 显示全部楼层    本楼为最佳答案   
在你的代码中,`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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-4 15:41:48 | 显示全部楼层
本帖最后由 jackz007 于 2024-9-4 19:54 编辑

      * ( * mat + i)  其实就是 * (* (mat + 0) +i) 二维数组表达就是 mat[0][i],意思是把 mat 作为一个拥有 ROW * COL 个元素的一维数组进行访问,我们知道,无论几维数组,每个元素在内存中的位置顺序,与定义数组时,各个元素的书写顺序是一致的,所以,多维数组是完全可以按照一维数组进行访问的。

      试试我改写的版本
#include<stdio.h>

#define ROW 3
#define COL 4

int main(void)
{
        int i                                     ;
        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[0][i])        ; // 此句被改写,改变的只是语句的书写形式
                if((i + 1) % 4 == 0) printf("\n") ;
        }
        return 0                                  ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 02:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表