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

水滴石穿C语言之指针综合谈

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
 概述

  Joel Spolsky认为,对指针的理解是一种aptitude,不是通过训练就能够达到的。虽然如此,我还是想谈一谈这个C/C 语言中最强劲也是最容易出错的要素。

  鉴于指针和现在电脑内存结构的关联,很多C语言比较本质的特点都孕育在其中,因此,本篇和第六、第七两篇我都将以指针为主线,结合在实际编程中碰到的问题,来周详谈谈关于指针的几个重要方面。

  指针类型的本质分析

  1、指针的本质

  指针的本质:一种复合的数据类型。下面我将以下面几个作为例子进行展开分析:

  a)、int *p;
  b)、int **p;
  c)、int (*parValue)[3];
  d)、int (*pFun)();

  分析:

  所谓的数据类型就是具备某种数据特征的东东,比如数据类型char,他的数据特征就是他所占据的内存为1个字节, 指针也很类似,指针所指向的值也占据着内存中的一块地址,地址的长度和指针的类型有关,比如对于char型指针,这个指针占据的内存就是1个字节,因此指针也是一种数据类型,但我们知道指针本身也占据了一个内存空间地址,地址的长度和机器的字长有关,比如在32位机器中,这个长度就是4个字节,因此指针本身也同样是一种数据类型,因此,我们说,指针其实是一种复合的数据类型,

  好了,现在我们能够分析上面的几个例子了。

  假设有如下定义:

int nValue;

  那么,nValue的类型就是int,也就是把nValue这个具体变量去掉后剩余的部分,因此,上面的4个声明能够类比进行分析:

  a)、int *

  *代表变量(指针本身)的值是个地址,int代表这个地址里面存放的是个整数,这两个结合起来,int *定义了一个指向整数的指针,类推如下:

  b)、int **

  指向一个指向整数的指针的指针。

  c)、int (*)[3]

  指向一个拥有三个整数的数组的指针。

  d)、int (*)()

  指向一个函数的指针,这个函数参数为空,返回值为整数。

  分析结束,从上面能够看出,指针包括两个方面,一个是他本身的值,是个内存中的地址;另一个是指针所指向的物,是这个地址中所存放着具备各种各样意义的数据。

  2、对指针本身值的分析

  下面例子考察指针本身的值(环境为32位的电脑):

void *p = malloc( 100 );

  请计算sizeof ( p ) = ?

char str[] = “Hello” ;
char *p = str ;

  请计算sizeof ( p ) = ?

void Func ( char str[100])
{
请计算 sizeof( str ) = ? //注意,此时,str已退化为一个指针,详情见
//下一篇指针和数组
}


  分析:上面的例子,答案都是4,因为从上面的讨论能够知道,指针本身的值对应着内存中的一个地址,他的size只和机器的字长有关(即他是由系统的内存模型决定的),在32位机器中,这个长度是4个字节。

  3、对指针所指向物的分析

  现在再对指针这个复合类型的第二部分,指针所指向物的意义进行分析。

  上面我们已得到了指针本身的类型,那么将指针本身的类型去掉 “*”号就可得到指针所指向物的类型,分别如下:

  a)、int

  所指向物是个整数。

  b)、int*

  所指向物是个指向整数的指针。

  c)、int ()[3]

  ()为空,能够去掉,变为int [3],所指向物是个拥有三个整数的数组。

  d)、int ()()

  第一个()为空,能够去掉,变为int (),所指向物是个函数,这个函数的参数为空,返回值为整数。

  4、附加分析

  另外,关于指针本身大小的问题,在C 中和C有所不同,这里我也顺带谈一下。

  在C 中,对于指向对象成员的指针,他的大小不一定是4个字节,这主要是因为在引入多重虚拟继承连同虚拟函数的时候,有些附加的信息也需要通过这个指针进行传递,因此指向对象成员的指针会增大,不论是指向成员数据,还是成员函数都是如此,具体和编译器的实现有关,您能够编写个很小的C 程式去验证一下。另外,对一个类的静态成员(static member,能够是静态成员变量或静态成员函数)来说,指向他的指针只是普通的函数指针,而不是个指向类成员的指针,所以他的大小不会增加,仍旧是4个字节。



[1] [2] [3] 下一页

文章整理:西部数码--专业提供域名注册虚拟主机服务
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