水滴石穿C语言之指针综合谈
2008-02-23 05:26:21来源:互联网 阅读 ()
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个字节。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 水滴石穿C语言之static辨析
下一篇: 水滴石穿C语言之指针、数组和函数
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash