FireBrain 发表于 2016-11-19 11:53:16

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

本帖最后由 FireBrain 于 2016-11-19 13:41 编辑

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

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

canspider 发表于 2016-11-19 13:29:41

intint_value;
int*int_ptr_value;
typedef int int_type;
typedef int *int_ptr_type;
int int_arr_value;
int (*int_arr_ptr_value);
typedef int int_arr_type;
typedef int (*int_arr_ptr_type);

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

myxiaonia 发表于 2016-11-19 14:09:33

c 不支持[]写在前面的做法,否则就明白多了

sibtck 发表于 2016-11-19 14:18:12

楼主是写C# JAVA出身的?

FireBrain 发表于 2016-11-19 14:22:36

sibtck 发表于 2016-11-19 14:18
楼主是写C# JAVA出身的?

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

ibichao 发表于 2016-11-19 14:24:40

*p用别的名称替代,p就是这个名称的指针
掌握这个技巧再复杂的指针都不怕

FireBrain 发表于 2016-11-19 14:25:38

ibichao 发表于 2016-11-19 14:24
*p用别的名称替代,p就是这个名称的指针
掌握这个技巧再复杂的指针都不怕 ...

lz好方法

FireBrain 发表于 2016-11-19 14:43:54

本帖最后由 FireBrain 于 2016-11-19 14:46 编辑

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

一个更加复杂的例子

prince2010 发表于 2016-11-19 17:02:14

行指针{:victory:}

bias 发表于 2016-11-19 17:19:28

int (*p);
int a={1,2,3,4};
p=&a;


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

我对指针也是一头乱

GunGun 发表于 2016-11-19 17:38:32

bias 发表于 2016-11-19 17:19
int (*p);
int a={1,2,3,4};
p=&a;


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

GunGun 发表于 2016-11-19 17:44:03

用print试一下就行了。
最好还是少用指针或不用指针。现在新兴的编程语言都几乎把指针取消了。

vuo50z 发表于 2016-11-19 19:40:43

int *p;int a={1,2,3,5};p=a; 一样效果,小范围使用不会错的。

YS126 发表于 2016-11-19 19:52:05

确实好理解很多……

foxpro2005 发表于 2016-11-19 20:11:26

本帖最后由 foxpro2005 于 2016-11-19 20:12 编辑

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

FireBrain 发表于 2016-11-20 11:42:35

本帖最后由 FireBrain 于 2016-11-20 11:53 编辑

vuo50z 发表于 2016-11-19 19:40
int *p;int a={1,2,3,5};p=a; 一样效果,小范围使用不会错的。

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

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

security 发表于 2016-11-20 14:31:39

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

vuo50z 发表于 2016-11-21 11:42:48

FireBrain 发表于 2016-11-20 11:42
int (*p);
int *q;
int a={1,2,3,4};


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

FireBrain 发表于 2016-11-21 15:38:14

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

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

qqfirer 发表于 2016-11-21 23:11:58

JAVA中就是像楼主这么写的。。确实更清晰

ponder2077 发表于 2016-11-22 19:07:30

ibichao 发表于 2016-11-19 14:24
*p用别的名称替代,p就是这个名称的指针
掌握这个技巧再复杂的指针都不怕 ...

一语中的, 厉害

蓝蓝的恋 发表于 2016-11-23 12:53:21

{:sad:}{:sad:}一直没这样用过指针

gamep 发表于 2016-11-23 13:01:30

下面写法不支持

权中正 发表于 2017-1-4 23:36:27

一直没弄明白指针这个东西

dgdzas 发表于 2017-1-18 15:13:48

3楼正解

titan0731avr 发表于 2017-1-30 00:18:55

眼花,看別人的代碼都是花

cddx 发表于 2017-2-13 23:08:09

本帖最后由 cddx 于 2017-2-13 23:10 编辑

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

gaowh 发表于 2017-2-14 11:01:51

按教材上的也好理解啊! i nt (*p);把*号去掉就是该指针类型   所以该指针为指向int p类型数据的指针。
页: [1]
查看完整版本: 终于明白int (*p)[4]的真正含义了(苦思了几天的成果)