鱼C论坛

 找回密码
 立即注册
查看: 216|回复: 4

[已解决]新手学二维数组指针

[复制链接]
发表于 2024-8-27 10:52:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x


一维数组中:a[i]和*(a+i)都是表示一维数组中的第i个元素,*作用是取值。


二维数组中:a[i]和*(a+i), 都是表示第i行0列元素地址,后者的*为啥作用不是取值啦

各位鱼友,老师,这该怎么看
最佳答案
2024-8-27 16:25:44
本帖最后由 jackz007 于 2024-8-27 18:06 编辑

    对于指针而言,最重要的是必须弄清楚一个表达式究竟是一个指针还是一个数组元素
    例如:
    对于一维数组
char p[256] ;
    p 是个一级指针(char *),* (p + i)  不再是任何指针,而是一个数组元素(char) p[i] 。

    对于二维数组
char q[256][64] ;
    q 是个二级指针(char **),* (q + i)  是一个一级指针(char *) ,* ( * (q + i) + j) 不再是任何指针,而是一个数组元素(char) q[i][j] 。

    对于三维数组
char r[256][64][16] ;
        r 是个三级指针(char ***),* (r + i)  是一个二级指针(char **) ,* ( * (r + i) + j) 是一个一级指针(char *),* (* ( * (r + i) + j) + k) 不再是任何指针,而是一个数组元素(char) r[i][j][k] 。

        【总结】:
char r [256][64][16] ;
/*
           r : 三级指针
         * r :二级指针 r[0]
        ** r :一级指针 r[0][0]
       *** r :数组元素 r[0][0][0]
*/
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-27 10:52:57 | 显示全部楼层
你好,鱼油!

二维数组确实有点让人困惑。让我来简洁地解释一下。

假设有一个二维数组 `int a[3][4]`,数组有3行4列。

- `a`:表示整个二维数组的首地址,即 `a[0]` 的地址。
- `a + i`:表示第 i 行的地址,也就是 `a[i]` 的地址。
- `*(a + i)`:解引用后,表示第 i 行的首地址,也就是 `a[i]` 的首地址,实际是 `a[i]`。

对于二维数组的指针操作:

1. `a` 是二维数组的名字,作为一个指针常量,它指向的是整个数组 `a[0][0]` 的地址。
2. `a + i` 是在 `a` 的基础上偏移了 `i` 行,它指向第 `i` 行的首地址,即 `a[i]`。
3. `*(a + i)` 是对 `a + i` 解引用,等同于 `a[i]`,表示第 `i` 行的首地址。

所以,在二维数组中,`a` 和 `*(a + i)` 并不是表示同一个内容,前者是整个数组首地址,而后者是第 `i` 行的首地址。如果我们想取第 i 行第 j 列的元素,可以用 `*(*(a + i) + j)`,也就是 `a[i][j]`。

希望这能帮助你理解!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-27 10:56:09 | 显示全部楼层
FishC 发表于 2024-8-27 10:52
你好,鱼油!

二维数组确实有点让人困惑。让我来简洁地解释一下。

`*(a + i)`:解引用是什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-27 10:56:19 | 显示全部楼层
八义士 发表于 2024-08-27 10:56
`*(a + i)`:解引用是什么意思


你好,鱼油!

“解引用”是指通过指针访问指针所指向的对象的值。让我们详细解释一下你提到的情况:

假设有一个二维数组 `int a[3][4]`,这个数组有3行4列。

- `a` 是一个指向包含4个整数的一维数组的指针。
- `a + i` 是指向第 `i` 行的指针。具体地说,`a + i` 是 `a` 的第 `i` 个元素的地址,也就是第 `i` 行的首地址。

那么,`*(a + i)` 怎么理解呢?

1. `a + i` 给我们的是第 `i` 行的首地址。
2. 通过 `*` 操作对 `a + i` 进行解引用,我们得到第 `i` 行这一整行(实际上是一个指向第 `i` 行第一个元素的指针)。

所以,`*(a + i)` 代表的是第 `i` 行的首地址,即 `a[i]`。

举个例子:假如我们有一个二维数组 `a`,如下所示:
int a[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

我们来理解具体的操作:
- `a` 是二维数组名字,指向数组首地址。
- `a + 1` 是二维数组 `a` 的第 1 行的首地址(即指向 `{5, 6, 7, 8}` 的首地址)。
- `*(a + 1)` 对第 1 行首地址进行解引用,得到的就是这行首地址对应的数组 `{5, 6, 7, 8}`。

这么一来,通过 `*(a + i)` 解引用的结果,可以使用索引操作,来取具体的值,比如 `*(*(a + 1) + 2)` 等于 `7`。

希望这一解释更加清晰,帮助你理解二维数组指针的解引用!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-27 16:25:44 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2024-8-27 18:06 编辑

    对于指针而言,最重要的是必须弄清楚一个表达式究竟是一个指针还是一个数组元素
    例如:
    对于一维数组
char p[256] ;
    p 是个一级指针(char *),* (p + i)  不再是任何指针,而是一个数组元素(char) p[i] 。

    对于二维数组
char q[256][64] ;
    q 是个二级指针(char **),* (q + i)  是一个一级指针(char *) ,* ( * (q + i) + j) 不再是任何指针,而是一个数组元素(char) q[i][j] 。

    对于三维数组
char r[256][64][16] ;
        r 是个三级指针(char ***),* (r + i)  是一个二级指针(char **) ,* ( * (r + i) + j) 是一个一级指针(char *),* (* ( * (r + i) + j) + k) 不再是任何指针,而是一个数组元素(char) r[i][j][k] 。

        【总结】:
char r [256][64][16] ;
/*
           r : 三级指针
         * r :二级指针 r[0]
        ** r :一级指针 r[0][0]
       *** r :数组元素 r[0][0][0]
*/
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 18:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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