搜索
bottom↓
回复: 43

让你不再害怕指针

  [复制链接]

出0入0汤圆

发表于 2012-4-7 21:39:57 | 显示全部楼层 |阅读模式
最近在网上发现一篇简介指针比交好的文章,和大家分享一下

要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则: 从变量名处起,根据运算符优先级结合,一步一步分析.
   下面让我们先从简单的类型开始慢慢分析吧:
   int p;          //p是一个普通的整型变量
int *p;         //首先从P处开始,先与*结合,所以说明P是一个指针,然后再与int结合,说明指针所指向
的内容的类型为int.所以P是一个返回整型数据的指针
   int p[3];             //首先从P处开始,先与[]结合,说明P是一个数组,然后与int结合,说明数组里的元素是整
                型的,所以P是一个由整型数据组成的数组
int *p[3];            //首先从P处开始,先与[]结合,因为其优先级比*,所以P是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int结合, 说明指针所指向的内容的类型是整型的,所以P是一个由返回整型数据的指针所组成的数组
int (*p)[3];           //首先从P处开始,先与*结合,说明P是一个指针然后再与[]结合("()"这步可以忽略,只是为 了改变优先级),说明指针所指向的内容是一个数组,然后再与int结合,说明数组里的元素是整型的.所以P是一个指向由整型数据组成的数组的指针
int **p;        //首先从P开始,先与*结合,说是P是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.
int p(int);           //P处起,先与()结合,说明P是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数然后再与外面的int结合,说明函数的返回值是一个整型数据
int (*p)(int);                //P处开始,先与指针结合,说明P是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int结合,说明函数有一个 int型的参数,再与最外层的int结合,说明函数的返回类型是整型,所以P是一个指向有一个整型参数且返回类型为整型的函数的指针
int*(*p(int))[3];  //可以先跳过,不看这个类型,过于复杂从P开始,先与()结合,说明P是一个函数,然后进入()里面,int结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int结合,说明指针指向的内容是整型数据.所以P是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.
说到这里也就差不多了,我们的任务也就这么多,理解了这几个类型,其它的类型对我们来说也是小菜了,不过我们一般不会用太复杂的类型,那样会大大减小程序的可读性,请慎用,这上面的几种类型已经足够我们用了.
以上只是一部分。。。。大家觉得好的欢迎下载



本帖子中包含更多资源

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

x

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-4-7 21:51:51 | 显示全部楼层
指针还用怕吗,一句话就明白:

存储单元相当于一个一个房间,门牌号码就是指针,变量名称其实就是指针(门牌)的别名。

如果某个房间里面,装的是另外一个房间的门牌号码,那么这个房间就叫做指向“指针”的房间(变量)


SORRY,两句话才说明白

出0入0汤圆

发表于 2012-4-7 21:52:54 | 显示全部楼层
指向“指针”的房间(变量)
用计算机的表示方法就是:
* 房间 后者叫做 *p

出0入0汤圆

发表于 2012-4-7 22:25:55 | 显示全部楼层
二楼言简意赅呀!

出0入0汤圆

发表于 2012-4-7 22:36:12 | 显示全部楼层
好东西

出0入0汤圆

发表于 2012-4-7 23:36:23 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2012-4-8 00:14:13 | 显示全部楼层
我感觉要弄懂指针,还是要看看汇编的

出0入0汤圆

发表于 2012-4-8 00:23:25 | 显示全部楼层
好东西,学习了

出0入0汤圆

发表于 2012-4-8 00:50:30 | 显示全部楼层
指针是清楚什么意思,但是还不是太会用

出0入0汤圆

发表于 2012-4-8 01:09:22 | 显示全部楼层
重点 不是指针的概念  而是指针的操作!

出0入0汤圆

发表于 2012-4-8 08:12:52 | 显示全部楼层
心里念叨着不害怕,但还是不踏实。就怕万一钥匙拿错了,进错了门。

出0入0汤圆

发表于 2012-4-8 08:34:49 | 显示全部楼层
其实嘛
指针这东西
要结合实例来学习
有的时候这么强大的功能 你不见得知道它在什么时候使用

出0入0汤圆

 楼主| 发表于 2012-4-8 09:13:12 | 显示全部楼层
Rick123 发表于 2012-4-8 08:34
其实嘛
指针这东西
要结合实例来学习

说的是那么一回事,如果基础不够牢固的话,在后面学习NXP的32位单片机或者上操作系统的时候就会感觉明显的吃力,比喻下面这样一个例子

OS_STK *OSTaskStkInit (void (*task)(void *p_arg),
   void *p_arg,
   OS_STK *ptos,
   INT16U opt) reentrant
{
   OS_STK *stk;   
  opt = opt;   
stk = ptos;   
  *stk++ = 15;
   *stk++ = (INT16U)task & 0xFF;   
  *stk++ = (INT16U)task >> 8;
*stk++ = 0x00;   
  *stk++ = 0x0A;   
  *stk++ = 0x0B;   
  *stk++ = 0x00;   
  *stk++ = 0x00;   
  *stk++ = 0x00;   
  *stk++ = (INT16U)p_arg & 0xFF;   
  *stk++ = (INT16U)p_arg >> 8;   
  *stk++ = 0x01;   
  *stk++ = 0x04;   
  *stk++ = 0x05;   
  *stk++ = 0x06;   
  *stk++ = 0x07;   
  *stk++ = (INT16U) (ptos+MaxStkSize) >> 8;   
  *stk++ = (INT16U) (ptos+MaxStkSize) & 0xFF;   
  return ptos;   
}

出0入0汤圆

发表于 2012-4-8 09:39:16 | 显示全部楼层
还是不怎么敢使用,基础不牢靠啊!

出0入0汤圆

发表于 2012-4-8 10:20:43 | 显示全部楼层
基础不行呀!

出0入0汤圆

发表于 2012-4-8 10:58:51 | 显示全部楼层
在“c语言深度解剖”中学到最复杂的是这样的:char * (*(*p)[3])(char * p);
这与帖子中最后一个int*(*p(int))[3];风格不一样,哪一个更复杂呢?

出0入0汤圆

发表于 2012-4-8 11:01:36 | 显示全部楼层
728196 发表于 2012-4-8 01:09
重点 不是指针的概念  而是指针的操作!

感同身受!用起来确实挺容易出错的!

出0入0汤圆

发表于 2012-4-30 12:15:58 | 显示全部楼层
越学越觉得C语言基础很重要

出0入0汤圆

发表于 2012-4-30 12:39:23 | 显示全部楼层
概念大家都知道,就是操作了,没怎么用过

出0入0汤圆

发表于 2012-4-30 13:49:18 | 显示全部楼层
指针这玩意实际就是指桑骂槐,用的时候头脑得清醒点!

出0入17汤圆

发表于 2012-4-30 13:57:30 | 显示全部楼层
我觉得指针实际上就是汇编。
这种东西能不用则不用,一方面因为容易出错,另一方面理解起来也难。
当你把数组,结构,联合搞明白了就可以抛弃指针了。
头像被屏蔽

出0入0汤圆

发表于 2012-4-30 18:51:12 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入21汤圆

发表于 2012-4-30 19:05:51 | 显示全部楼层
“我觉得指针实际上就是汇编。
这种东西能不用则不用,一方面因为容易出错,另一方面理解起来也难。
当你把数组,结构,联合搞明白了就可以抛弃指针了。”
有道理,我一直很少用指针

出0入0汤圆

发表于 2012-4-30 19:36:39 | 显示全部楼层
不管指针有没有用,当涉及到RTOS的时候,我们还是要用到很多指针的,而且功能很强大,我觉得有必要学一下指针。谢谢lz的分享

出0入0汤圆

发表于 2012-5-13 23:26:42 | 显示全部楼层
好东西,学习了

出0入0汤圆

发表于 2012-5-30 20:02:03 | 显示全部楼层
支持二楼

出0入0汤圆

发表于 2012-5-30 20:38:52 | 显示全部楼层
二楼好比喻。

出0入0汤圆

发表于 2012-5-30 23:38:02 来自手机 | 显示全部楼层
觉得明白,用起来还是有点困难

出0入0汤圆

发表于 2013-2-26 18:25:59 | 显示全部楼层
Niandet 发表于 2012-4-7 21:51
指针还用怕吗,一句话就明白:

存储单元相当于一个一个房间,门牌号码就是指针,变量名称其实就是指针(门 ...

我真的不怕了

出0入0汤圆

发表于 2013-2-26 18:32:58 | 显示全部楼层
对我来说一直很模糊的概念

出0入0汤圆

发表于 2013-2-26 19:03:38 | 显示全部楼层
指针变量本身也是需要空间的. 一般需要的只是变量存储的内容和其指向的内容.

出110入8汤圆

发表于 2013-2-26 19:43:36 | 显示全部楼层
二楼说的精辟!

出0入0汤圆

发表于 2013-2-26 21:17:24 | 显示全部楼层
好好好好好好好

出0入0汤圆

发表于 2013-2-26 21:38:17 | 显示全部楼层
mark,精辟

出0入0汤圆

发表于 2013-2-27 00:11:58 | 显示全部楼层
需要跟她多来点儿亲密接触!

出0入0汤圆

发表于 2013-2-27 11:12:23 | 显示全部楼层
受教了  

出0入0汤圆

发表于 2013-2-28 13:14:00 来自手机 | 显示全部楼层
mark。。。

出0入0汤圆

发表于 2013-3-21 16:38:03 | 显示全部楼层
学习

出0入0汤圆

发表于 2013-3-22 23:21:30 | 显示全部楼层
学习了,谢谢

出0入0汤圆

发表于 2013-3-23 10:55:09 来自手机 | 显示全部楼层
学习一下....

出0入0汤圆

发表于 2013-3-23 11:05:20 | 显示全部楼层
不怕不怕啦!!

出0入0汤圆

发表于 2013-3-23 11:09:53 | 显示全部楼层
很有必要学好指针,我觉得这是进阶的关键。。。

出0入0汤圆

发表于 2013-3-23 11:14:41 | 显示全部楼层
二楼好比喻!
关键还是在如何操作
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-18 12:51

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

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