手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C 中指针的使用艺术

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
 在C 编程中使用指针能有速度快,节约内存等长处,是很多C 程式员的最爱。但指针是一把双刃剑,用好了他,您就会发现指针有多么的方便,反之,您可能就头疼了,往往会出现意想不到的问题。

  一.什么是指针:

  其实指针就像是其他变量相同,所不同的是一般的变量包含的是实际的真实的数据,而指针只是个指示器,他告诉程式在内存的哪块区域能够找到数据。

  这是个很重要的概念,有很多程式和算法都是围绕指针设计的,如链表、遍历等。

  指针是个数据类型,本身也需要占用四个字节的存储空间。所以用sizeof(void*)获得的值为4。

  二.指针的定义

  看如下的例子:

int *pNumber;

  这样就定义了int类型的指针。

  指针变量名称以p为首字符,这是程式员通常在定义指针时的一个习惯,以提高便程式的阅读性,表示这是个指针。另外,虽然int* pNumber和int *pNumber是相同的,但是使用后一种的编程风格更好一些。比如:

int *pNumber1,*pNumber2;表示定义两个指针,*号和变量靠近;反之,我们可能会定义成int* pNumber1,pNumber2,这将是个错误的定义,pNumber2就不是指针了。

  三.指针的长处

  a.为函数提供修改调用变元的手段;

  b.支持C 动态分配子程式

  c.能够改善某些子程式的效率

  d.为动态数据结构(如二叉树、链表)提供支持

  四、指针赋值及转换:

  a.同类型直接赋值,异类型要进行转换。

  b.强制转换:能够把表达式结果硬性转换为指定类型

  c.char * p;(int *)p 把p强制转换为int型,记住转换过程中要注意两个类型的大小,大转小时可能会有数据丢失(如int到double)

  d.涉及void *的:

  c 中void *类型可赋值给任何类型的指针,反之亦然

  c 中都需要强制转换

  void * 可看作无穷大能接纳任何类型赋值,反之不行int * p =9;void * t= p(正确);p=t(错误)

  e.不涉及void *的都要强制转换

  五.指针和数组

  不带下标的数组名返回数组的起始地址,即数组首元素的地址,所以对数组的访问可有两种方式:数组下标和指针算术。例如:

char* pChar;

char chs[100];

pChar = chs;这样pChar就指向chs数组的首地址。

  六.数组和引用

  a.引用只是变量的别名,而不是指向变量的指针(区别于取址运算符"&")不占内存空间,对变量引用的改变其相应的变量也会改变。

  b.不能对引用使用指针间接运算符“*”进行复引用操作

  c.引用必须在声明时初始化 int &c = count;(c是count的别名)

  七.指针空间的动态分配和回收

  动态分配是指针的关键技术。他是用来在不必定义变量的情况下分配内存和让指针去指向他们。分配了内存,别忘了回收。您动态地分配了一个内存空间,可他绝不会被自动删除。也就是说,这块内存空间会一直存在,直到您告诉电脑您已使用完了。可结果是,您并没有告诉电脑您已不再需要这块内存空间了,所以他会继续占据着内存空间造成浪费,甚至您的程式运行完毕,其他程式运行时他还存在。当这样的问题积累到一定程度,最终将导致系统崩溃。所以这是很重要的,在您用完他以后,请释放他的空间。

  八.实际使用指针时,容易出现的错误

  笔者归纳出指针错误的原因有以下几点(个人经验,欢迎大家补充):

  1.指针未初始化。

  指针的初始化,不是指指针的定义,而是指针变量存储的数值是个无效的数值。比如定义float a;这个a会分配一个地址,但初始值是个乱七八糟的数据。同样,float *a;也会为a分配一个地址,初始值也是乱七八糟的数据。初始化能够将a = NULL,这样在以后的程式中能够增加if(a == NULL)来判断指针是否有效,否则不行。或为指针分配或指定空间。如 float *a = new float;或float b; float *a = &b;都能够为指针指向一块内存以实现初始化。

  2.指针越界

  指针越界是个比较难以捕获的错误。假如测试不全面,不容易被发现。对于为指针分配的空间大小,程式员一定要时刻注意。

  3.指向局部变量的指针

  指针是记录某块内存起始地址的变量,要使指针有效,则必须确保这块内存有效。用new分配的内存空间,只要不delete,则一直有效。但是对于指向某个变量地址的指针,程式员必须清楚该变量的作用域。假如离开了变量的作用域,该变量的内存空间就会被系统自动回收,再使用指针时,将会发生错误。这是程式中最容易出现的错误。

  4.指针指向的转移

  有些初涉C 的程式员,常常会写出这样的程式:

char *pChar = new char;

char chs;

pChar = &chs;

delete pChar;

  他们的目的是想将chs内容传递给pChar指针指向的内存。但这样写,将会使pChar先前指向的空间编程垃圾地址,因为地址无法再获取了。俗称野指针。将会导致内存泄漏。而且,在调用delete pChar时,也会发生异常错误。因为不是new的空间是不能使用delete删除的。因为pChar已转到指向chs这个变量的地址了。

  指针的艺术远不止这些,留待我们的爱好者进行深入的探讨。指针给我们的程式带来了太多的方便,同样,他也有很多难以控制的问题。如何更好的驾驭指针,能够说是C 程式员提高自己的一个手段。

  『注』本文参考了博客网的C 入门笔记,综合了笔者自己对指针的理解。




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS