终于明白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。
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; c 不支持[]写在前面的做法,否则就明白多了 楼主是写C# JAVA出身的? sibtck 发表于 2016-11-19 14:18
楼主是写C# JAVA出身的?
涉猎的语言比较多,从单片机到现在做的web。学过的语言有c,delphi,js,php,golang等。 *p用别的名称替代,p就是这个名称的指针
掌握这个技巧再复杂的指针都不怕 ibichao 发表于 2016-11-19 14:24
*p用别的名称替代,p就是这个名称的指针
掌握这个技巧再复杂的指针都不怕 ...
lz好方法 本帖最后由 FireBrain 于 2016-11-19 14:46 编辑
http://www.amobbs.com/thread-5663640-1-1.html
一个更加复杂的例子 行指针{:victory:} int (*p);
int a={1,2,3,4};
p=&a;
后
*p是a的地址?
**p才是数值1吗?
我对指针也是一头乱
bias 发表于 2016-11-19 17:19
int (*p);
int a={1,2,3,4};
p=&a;
好像是多了一个*。
p是地址
*p是数据 用print试一下就行了。
最好还是少用指针或不用指针。现在新兴的编程语言都几乎把指针取消了。 int *p;int a={1,2,3,5};p=a; 一样效果,小范围使用不会错的。 确实好理解很多…… 本帖最后由 foxpro2005 于 2016-11-19 20:12 编辑
这里的p相当于是(二维数组的)行指针: 它的基类型是指向包含有4个int类型元素的数组类型, 故在这里它只能指向 int 类型的数据 本帖最后由 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只不过是取这种变量类型的地址。 给个建议:
解题技巧有多种,但这是要建立在掌握原理本质的基础上的,
我们其实可以先去看看本质,看看编译器是如何解释的,
这些原理,我在另外的帖子里有提到,也就是 8 楼,楼主提到的另一个复杂的例子。
有兴趣的,可以移步过去。 FireBrain 发表于 2016-11-20 11:42
int (*p);
int *q;
int a={1,2,3,4};
我知道你的意思是让指针p是一个只能指向4个int类型元素的数组的指针,而不能指向5个或3个元素的。
这相当于新定义了一种变量类型,最好使用typedef。否则一个新手误以为这是一个int的指针,做p++的时候就会和自己想的不一样了。
我的方法是用简单的类型实现同样的功能,有点不严谨,但方法简单,稍加注意就可以了。 vuo50z 发表于 2016-11-21 11:42
我知道你的意思是让指针p是一个只能指向4个int类型元素的数组的指针,而不能指向5个或3个元素的。
这相当 ...
自己写程序可以像你那样重新定义一下类型,但看别人的代码呢?网上大量的代码都是那种变态写法,改成我的那种表达的方式很容易就看懂了. JAVA中就是像楼主这么写的。。确实更清晰 ibichao 发表于 2016-11-19 14:24
*p用别的名称替代,p就是这个名称的指针
掌握这个技巧再复杂的指针都不怕 ...
一语中的, 厉害 {:sad:}{:sad:}一直没这样用过指针 下面写法不支持 一直没弄明白指针这个东西 3楼正解 眼花,看別人的代碼都是花 本帖最后由 cddx 于 2017-2-13 23:10 编辑
呵呵,用了C#或JAVA后,再写C经常要反应一会儿才能写正确。 按教材上的也好理解啊! i nt (*p);把*号去掉就是该指针类型 所以该指针为指向int p类型数据的指针。
页:
[1]