搜索
bottom↓
回复: 27

终于明白int (*p)[4]的真正含义了(苦思了几天的成果)

  [复制链接]

出0入0汤圆

发表于 2016-11-19 11:53:16 | 显示全部楼层 |阅读模式
本帖最后由 FireBrain 于 2016-11-19 13:41 编辑

虽然学c语言已经5年多了,但一直没有深入研究过,直到最近要做一个拼音输入法,用到了比较复杂的指针类型,才知道c语言指针的陷阱。下面我讲下一int (*p)[4]的真正含义,我相信只要能明白它的含义,其他更复杂的也可以迎刃而解了。
int (*p)[4];
int a[4]={1,2,3,4};
p=&a;

上面的是c语言的表达方式,下面是我的表达方式
int[4] *p;
int[4] a={1,2,3,5};
p=&a;
改成这种方式是不是清晰多了,就像int *p; int a; p=&a;一样简单了。
其实有些东西不懂,不是我们笨。是那些东西本来做的就很傻x。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入8汤圆

发表于 2016-11-19 13:29:41 来自手机 | 显示全部楼层
int  int_value;
int  *int_ptr_value;
typedef int int_type;
typedef int *int_ptr_type;
int int_arr_value[4];
int (*int_arr_ptr_value)[4];
typedef int int_arr_type[4];
typedef int (*int_arr_ptr_type)[4];

一般更复杂的指针类型我会先用一个typedef来转一下
typedef int p4_arr_t[4];
p4_arr_t *p;

出0入0汤圆

发表于 2016-11-19 14:09:33 | 显示全部楼层
c 不支持[]写在前面的做法,否则就明白多了

出0入0汤圆

发表于 2016-11-19 14:18:12 | 显示全部楼层
楼主是写C# JAVA出身的?

出0入0汤圆

 楼主| 发表于 2016-11-19 14:22:36 | 显示全部楼层
sibtck 发表于 2016-11-19 14:18
楼主是写C# JAVA出身的?

涉猎的语言比较多,从单片机到现在做的web。学过的语言有c,delphi,js,php,golang等。

出0入4汤圆

发表于 2016-11-19 14:24:40 | 显示全部楼层
*p用别的名称替代,p就是这个名称的指针
掌握这个技巧再复杂的指针都不怕

出0入0汤圆

 楼主| 发表于 2016-11-19 14:25:38 | 显示全部楼层
ibichao 发表于 2016-11-19 14:24
*p用别的名称替代,p就是这个名称的指针
掌握这个技巧再复杂的指针都不怕 ...

lz好方法

出0入0汤圆

 楼主| 发表于 2016-11-19 14:43:54 | 显示全部楼层
本帖最后由 FireBrain 于 2016-11-19 14:46 编辑

http://www.amobbs.com/thread-5663640-1-1.html

一个更加复杂的例子

出0入0汤圆

发表于 2016-11-19 17:02:14 | 显示全部楼层
行指针

出0入10汤圆

发表于 2016-11-19 17:19:28 | 显示全部楼层
int (*p)[4];
int a[4]={1,2,3,4};
p=&a;


*p是a[0]的地址?
**p才是数值1吗?

我对指针也是一头乱

出0入0汤圆

发表于 2016-11-19 17:38:32 | 显示全部楼层
bias 发表于 2016-11-19 17:19
int (*p)[4];
int a[4]={1,2,3,4};
p=&a;

好像是多了一个*。
p是地址
*p是数据

出0入0汤圆

发表于 2016-11-19 17:44:03 | 显示全部楼层
用print试一下就行了。
最好还是少用指针或不用指针。现在新兴的编程语言都几乎把指针取消了。

出0入0汤圆

发表于 2016-11-19 19:40:43 来自手机 | 显示全部楼层
int *p;  int[4] a={1,2,3,5};  p=a; 一样效果,小范围使用不会错的。

出0入0汤圆

发表于 2016-11-19 19:52:05 来自手机 | 显示全部楼层
确实好理解很多……

出0入76汤圆

发表于 2016-11-19 20:11:26 | 显示全部楼层
本帖最后由 foxpro2005 于 2016-11-19 20:12 编辑

这里的p相当于是(二维数组的)行指针: 它的基类型是指向包含有4个int类型元素的数组类型, 故在这里它只能指向 int [4]类型的数据

出0入0汤圆

 楼主| 发表于 2016-11-20 11:42:35 | 显示全部楼层
本帖最后由 FireBrain 于 2016-11-20 11:53 编辑
vuo50z 发表于 2016-11-19 19:40
int *p;  int[4] a={1,2,3,5};  p=a; 一样效果,小范围使用不会错的。


int (*p)[4];
int *q;
int a[4]={1,2,3,4};
p=&a;
q=a;
这里的p是int[4]类型的指针,而q是int型的指针。这个可以再复杂一些,lz可能就不会觉得我的写法是鸡肋了。

int (*p[10])[4];
int a[4]={1,2,3,4};
int b[4]={5,6,7,8};
p[0]=&a;
p[1]=&b;
再次转换为我的表达方式:
int[4] *p[10];
int[4] a={1,2,3,4};
int[4] b={5,6,7,8};
p[0]=&a;
p[1]=&b;
再次强调a和b只不过是int[4]类型的变量而已,&a只不过是取这种变量类型的地址。

出0入8汤圆

发表于 2016-11-20 14:31:39 | 显示全部楼层
给个建议:
解题技巧有多种,但这是要建立在掌握原理本质的基础上的,
我们其实可以先去看看本质,看看编译器是如何解释的,
这些原理,我在另外的帖子里有提到,也就是 8 楼,楼主提到的另一个复杂的例子。
有兴趣的,可以移步过去。

出0入0汤圆

发表于 2016-11-21 11:42:48 | 显示全部楼层
FireBrain 发表于 2016-11-20 11:42
int (*p)[4];
int *q;
int a[4]={1,2,3,4};

我知道你的意思是让指针p是一个只能指向4个int类型元素的数组的指针,而不能指向5个或3个元素的。
这相当于新定义了一种变量类型,最好使用typedef。否则一个新手误以为这是一个int的指针,做p++的时候就会和自己想的不一样了。
我的方法是用简单的类型实现同样的功能,有点不严谨,但方法简单,稍加注意就可以了。

出0入0汤圆

 楼主| 发表于 2016-11-21 15:38:14 | 显示全部楼层
vuo50z 发表于 2016-11-21 11:42
我知道你的意思是让指针p是一个只能指向4个int类型元素的数组的指针,而不能指向5个或3个元素的。
这相当 ...

自己写程序可以像你那样重新定义一下类型,但看别人的代码呢?网上大量的代码都是那种变态写法,改成我的那种表达的方式很容易就看懂了.

出0入0汤圆

发表于 2016-11-21 23:11:58 | 显示全部楼层
JAVA中就是像楼主这么写的。。确实更清晰

出0入0汤圆

发表于 2016-11-22 19:07:30 | 显示全部楼层
ibichao 发表于 2016-11-19 14:24
*p用别的名称替代,p就是这个名称的指针
掌握这个技巧再复杂的指针都不怕 ...

一语中的, 厉害

出0入8汤圆

发表于 2016-11-23 12:53:21 | 显示全部楼层
一直没这样用过指针

出0入0汤圆

发表于 2016-11-23 13:01:30 | 显示全部楼层
下面写法不支持

出0入0汤圆

发表于 2017-1-4 23:36:27 | 显示全部楼层
一直没弄明白指针这个东西

出0入0汤圆

发表于 2017-1-18 15:13:48 | 显示全部楼层
3楼正解

出0入0汤圆

发表于 2017-1-30 00:18:55 | 显示全部楼层
眼花,看別人的代碼都是花

出0入0汤圆

发表于 2017-2-13 23:08:09 | 显示全部楼层
本帖最后由 cddx 于 2017-2-13 23:10 编辑

呵呵,用了C#或JAVA后,再写C经常要反应一会儿才能写正确。

出0入0汤圆

发表于 2017-2-14 11:01:51 | 显示全部楼层
按教材上的也好理解啊! i nt (*p)[4];  把*号去掉就是该指针类型   所以该指针为指向int p[4]类型数据的指针。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 04:31

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

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