鱼C论坛

 找回密码
 立即注册
查看: 1159|回复: 9

[已解决]数组指针

[复制链接]
发表于 2020-11-21 18:47:33 | 显示全部楼层 |阅读模式

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

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

x
#include<stdio.h>
int main()
{
char a[4][3][2] = {
        {
                {'a', 'b'}, {'c', 'd'}, {'e', 'f'}
        },
        {
                {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
        },
        {
                {'m', 'n'}, {'o', 'p'}, {'q', 'r'}
        },
        {
                {'s', 't'}, {'u', 'v'}, {'w', 'x'}
        }
};
char (*pa)[2] = &a[1][0];
char (*ppa)[3][2] = &a[1]

printf("%c\n",*(*(pa+8)+1));
printf("%c",*(*(*(ppa+2)+2)+1));
}






这里数组指针的方括号左右有什么联系嘛,为什么加或减一个方括号就出错了?
最佳答案
2020-11-21 22:46:17
南宫倾梨 发表于 2020-11-21 21:01
因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa)[2] = &a[1][0];
char (*ppa)[3][2] = ...


第一句是定义了一个一维指针,它有两个元素,第二句是定义了一个二维指针,它有三行,每行有两个元素
这两句是等价的,都是将字母 g 那个单元的地址赋给指针
*(*(pa+8)+1) 与 *(*(*(ppa+2)+2)+1) 也是等价的,都是指向字母 x,所以,两句输出的都是字母 x
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-21 19:58:28 | 显示全部楼层
看不明白你的意思,请确认:花括号 {,中括号 [,圆括号(,尖括号<
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-21 21:01:32 | 显示全部楼层
因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa)[2] = &a[1][0];
char (*ppa)[3][2] = &a[1];
这两句希望您可以讲解一下,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-21 21:02:11 | 显示全部楼层
风过无痕1989 发表于 2020-11-21 19:58
看不明白你的意思,请确认:花括号 {,中括号 [,圆括号(,尖括号


因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa)[2] = &a[1][0];
char (*ppa)[3][2] = &a[1];
这两句希望您可以讲解一下,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-21 22:46:17 | 显示全部楼层    本楼为最佳答案   
南宫倾梨 发表于 2020-11-21 21:01
因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa)[2] = &a[1][0];
char (*ppa)[3][2] = ...


第一句是定义了一个一维指针,它有两个元素,第二句是定义了一个二维指针,它有三行,每行有两个元素
这两句是等价的,都是将字母 g 那个单元的地址赋给指针
*(*(pa+8)+1) 与 *(*(*(ppa+2)+2)+1) 也是等价的,都是指向字母 x,所以,两句输出的都是字母 x
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-21 22:57:49 From FishC Mobile | 显示全部楼层
这个问题太过复杂,不适合初次接触数组指针的新手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-21 23:13:01 From FishC Mobile | 显示全部楼层
本帖最后由 倒戈卸甲 于 2020-11-21 23:25 编辑
南宫倾梨 发表于 2020-11-21 21:02
因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa)[2] = &a[1][0];
char (*ppa)[3][ ...


a,a[0],a[0],a[0][0]其实表示同一个地址,这是语法规定。以此为前提。
在这里pa指向一维数组,拿到的是{'g','h'}的地址,指向的也是{'g','h'},因为pa定义时长度为2的一维数组,pa+8会越过8个长度为2的一维数组,指向{'w','x'},那么*(pa+8)指向这个长度为2小数组的首元素'w',*(pa+8)+1就是再向前偏移1位指向'x',*(*(pa+8)+1)就是在此基础上真正拿到x。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-21 23:21:44 From FishC Mobile | 显示全部楼层
本帖最后由 倒戈卸甲 于 2020-11-21 23:29 编辑

至于ppa,首先它是一个二维指针数组,指向的是{ {'g', 'h'}, {'i', 'j'}, {'k', 'l'} }这个3x2数组,ppa+2本身会越过两个3x2数组指向 { {'s', 't'}, {'u', 'v'}, {'w', 'x'}},因此*(ppa+2)则指向{'s', 't'}, *(ppa+2)+2则指向{'w', 'x'},后面我就不详说了,因为到这里*(ppa+2)+2和上面的pa+8没任何区别,反正后面就是一层层剥开,你暂时领略个大概就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-22 16:21:51 | 显示全部楼层
倒戈卸甲 发表于 2020-11-21 23:21
至于ppa,首先它是一个二维指针数组,指向的是{ {'g', 'h'}, {'i', 'j'}, {'k', 'l'} }这个3x2数组,ppa+2 ...


谢谢,这个明白了
我还有一个问题就是那两个指针为什么指的都是'g'?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-22 21:27:27 From FishC Mobile | 显示全部楼层
本帖最后由 倒戈卸甲 于 2020-11-22 21:30 编辑
南宫倾梨 发表于 2020-11-22 16:21
谢谢,这个明白了
我还有一个问题就是那两个指针为什么指的都是'g'?


语法规定,或者说底层的数据结构决定的规则。数组名=数组的地址=数组首元素的地址。也就是我最初的那句话。{{'g', 'h'}, {'i', 'j'}, {'k', 'l'} }这个数组元素的地址与它的第一个元素也就是{'g', 'h'}这个数组元素的地址相同。而{'g', 'h'}这个数组元素元素又于它的首元素'g'地址相同。所以两个指针分别指向{{'g', 'h'}, {'i', 'j'}, {'k', 'l'}}和{'g', 'h'}, 但指向了同一个地址,且都和'g'的地址相同。这个是硬性规定,先记住就好。将来你学习到c语言的底层,掌握了数组这个容器的数据结构,自然理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 13:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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