搜索
bottom↓
回复: 8

一个关于c语言指针的问题(avr 输入法片段)

[复制链接]

出0入0汤圆

发表于 2016-11-17 23:24:01 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 FireBrain 于 2016-11-18 06:40 编辑

下面的指针的定义实在看不懂,大神们讲讲课吧!
unsigned char *(* PY_index_pointer[27])[8]=
{
PY_index_a,PY_index_b,PY_index_c,PY_index_d,PY_index_e,PY_index_f,PY_index_g,PY_index_h,
PY_index_j,PY_index_j,PY_index_k,PY_index_l,PY_index_m,PY_index_n,PY_index_o,PY_index_p,
PY_index_q,PY_index_r,PY_index_s,PY_index_t,PY_index_w,PY_index_w,PY_index_w,PY_index_x,
PY_index_y,PY_index_z,PY_index_end//*/
};

出0入0汤圆

发表于 2016-11-18 08:31:02 | 显示全部楼层
你得先说出哪里不懂才行啊,ps:楼主在做拼音输入法?

出0入0汤圆

 楼主| 发表于 2016-11-18 08:51:51 | 显示全部楼层
本帖最后由 FireBrain 于 2016-11-18 08:54 编辑
kang732816702 发表于 2016-11-18 08:31
你得先说出哪里不懂才行啊,ps:楼主在做拼音输入法?


就是这个定义不明白  unsigned char *(* PY_index_pointer[27])[8]
*和[]的组合在一起就晕了

出0入8汤圆

发表于 2016-11-18 09:52:31 | 显示全部楼层
这个真心不好讲,期待别人更好的解答吧,
对我而言,我不懂得写,也不想写出这样的代码。

我特意去网络上查看了下这个拼音输入法的代码片段
貌似别人的写法都是:
  1. unsigned char (* PY_index_pointer[27])[8]=
  2. {
  3. PY_index_a,PY_index_b,PY_index_c,PY_index_d,PY_index_e,PY_index_f,PY_index_g,PY_index_h,
  4. PY_index_j,PY_index_j,PY_index_k,PY_index_l,PY_index_m,PY_index_n,PY_index_o,PY_index_p,
  5. PY_index_q,PY_index_r,PY_index_s,PY_index_t,PY_index_w,PY_index_w,PY_index_w,PY_index_x,
  6. PY_index_y,PY_index_z,PY_index_end//*/
  7. };
复制代码

其中,PY_index_a 之类的都是一个二维数组,列的 size 为 8。

所以不去看这个繁琐的定义,直接来理解就是:
1、PY_index_pointer 是一个数组指针,共有 27 个元素,元素的类型为指针;
2、指针的类型为 unsigned char array[8],即指针指向了一个一维数组,数组共有 8 个 unsigned char 数据。
你认为如何?是否正确?

出0入8汤圆

发表于 2016-11-19 10:39:07 | 显示全部楼层
本帖最后由 security 于 2016-11-19 11:42 编辑

没人来传授一下?
那我就再给 LZ 多说一下吧:
这是个复杂的声明,你要想知道分析的本质,可以去看《C专家编程》,第 3 章,用了一章节来说明类似的问题,去那边寻找答案吧。

我自己是拒绝写这样的代码的,因为这又进一步拉大了我跟编译器,翻译代码逻辑的速度差距,不过话说回来,或许是自己的能力还比较弱吧。

下面有一个专业的的网站,你可以去输入这个复杂的语句,它会告诉你最终的结果,而分析过程,如上所述,去看《C专家编程》。
快,戳我戳我:cdecl.ridiculousfish.com

出0入96汤圆

发表于 2016-11-19 11:03:04 | 显示全部楼层
PY_index_j 定义了两遍

出0入0汤圆

 楼主| 发表于 2016-11-19 13:24:16 | 显示全部楼层
终于明白了,下面举例说明
#include "stdio.h"

int a[][8]={{1,2,3},
             {4,5,6}};
  int b[][8]={{11,22,33},
              {12,23,34}};

  int (*p[5])[8]={a,b};

int main()
{
  printf("%d",(*p)[0][2]);
       
}

上面的代码经验证是正确的,结果为3.
将上面的变量定义用下面的代码表示
int[8] a[0]={1,2,3};
int[8] a[1]={4,5,6};
int[8] b[0]={11,22,33};
int[8] b[1]={12,23,34};
int[8] *p[27]={a,b};
解释一下int[8]  只不过是个类型,a[],b[]只不过是这种类型的数组而已,*p[27]是指向类型int[8]的指针数组。
大家之所以认为c语言的指针难,是因为c语言的变态的表达方式,只要按上面的方法转换一下,立刻让c语言变态的指针原形毕露。
再次感谢大家帮助提供了不少线索。

出0入0汤圆

 楼主| 发表于 2016-11-19 13:25:43 | 显示全部楼层
security 发表于 2016-11-18 09:52
这个真心不好讲,期待别人更好的解答吧,
对我而言,我不懂得写,也不想写出这样的代码。

lz正解,我的代码确实错了,应该为
unsigned char (* PY_index_pointer[27])[8]=
{
PY_index_a,PY_index_b,PY_index_c,PY_index_d,PY_index_e,PY_index_f,PY_index_g,PY_index_h,
PY_index_j,PY_index_j,PY_index_k,PY_index_l,PY_index_m,PY_index_n,PY_index_o,PY_index_p,
PY_index_q,PY_index_r,PY_index_s,PY_index_t,PY_index_w,PY_index_w,PY_index_w,PY_index_x,
PY_index_y,PY_index_z,PY_index_end//*/
};

出0入0汤圆

发表于 2016-11-19 15:11:41 | 显示全部楼层
本帖最后由 myxiaonia 于 2016-11-19 15:18 编辑
FireBrain 发表于 2016-11-19 13:25
lz正解,我的代码确实错了,应该为
unsigned char (* PY_index_pointer[27])[8]=
{


多了一给我*,话说你的理解办法挺好的啊

  int (*p[5])[8]={a,b};
这个初始化方法是不对的吧,p[1] = b[0]而不是a[1],因为a=&a[0],为了不产生迷惑,写成如下更不容易出错
  int (*p[5])[8]={&a[0],&b[0]};
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 16:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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