爬虫121 发表于 2024-9-4 14:34:30

取值运算符疑惑

#include<stdio.h>
#define ROW 3
#define COL 4
int main()
{
    int i, j;
    int mat={
    {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想加形成地址偏移

FishC 发表于 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`,也就是指向二维数组第一行(即 `mat`)的指针。因为 `mat` 本身就是一个一维数组,它的类型是 `int`,所以 `*mat` 就是 `&mat`,即指向第一个元素的指针。

3. `*mat + i` 相当于 `&mat + i`,这意味着它指向内存中从 `mat` 开始偏移 `i` 个整数位置的地址。

4. `*(*mat + i)` 进一步解引用这个结果,获取到从 `mat` 开始偏移 `i` 后的那个具体整数值。因此,当你在循环中让 `i` 从 0 递增到 `ROW*COL-1`,你依次访问 `mat` 中的每一个元素。

结果是,这段代码将以行优先顺序打印出二维数组中的每一个元素。在 C 中,二维数组的这种线性存储方式可以让我们通过指针计算方便地访问元素。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-9-4 15:41:48

本帖最后由 jackz007 于 2024-9-4 19:54 编辑

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

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

#define ROW 3
#define COL 4

int main(void)
{
      int i                                     ;
      int mat= {
                           {1,2,3,4},
                           {5,6,7,8},
                           {9,10,11,12}
                           }                      ;
      for(i = 0 ; i < ROW * COL ; i ++) {
                printf("%d\t" , mat)      ; // 此句被改写,改变的只是语句的书写形式
                if((i + 1) % 4 == 0) printf("\n") ;
      }
      return 0                                  ;
}
页: [1]
查看完整版本: 取值运算符疑惑