快速业务通道

完整的学习C++的读书路线图(2)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

指针,数组,类型的识别,参数可变的函数。

一.指针。

它的本质是地址的类型。在许多语言中根本就没有这个概念。但是它却正是C灵活,高效,在面向过程的时代所向披靡的原因所在。因为C的内存模型基本上对应了现在von Neumann(冯。诺伊曼)计算机的机器模型,很好的达到了对机器的映射。不过有些人似乎永远也不能理解指针「注1」。

注1:Joel Spolsky就是这样认为的,他认为对指针的理解是一种aptitude,不是通过训练就可以达到的http://www.joelonsoftware.com/pr …… /fog0000000073.html

指针可以指向值、数组、函数,当然它也可以作为值使用。

看下面的几个例子:

int* p;//p是一个指针,指向一个整数

int** p;//p是一个指针,它指向第二个指针,然后指向一个整数

int (*pa)[3];//pa是一个指针,指向一个拥有3个整数的数组

int (*pf)();//pf是一个指向函数的指针,这个函数返回一个整数

后面第四节我会详细讲解标识符(identifier)类型的识别。

1.指针本身的类型是什么?

先看下面的例子:int a;//a的类型是什么?

对,把a去掉就可以了。因此上面的4个声明语句中的指针本身的类型为:

int*

int**

int (*)[3]

int (*)()

它们都是复合类型,也就是类型与类型结合而成的类型。意义分别如下:

point to int(指向一个整数的指针)

pointer to pointer to int(指向一个指向整数的指针的指针)

pointer to array of 3 ints(指向一个拥有三个整数的数组的指针)

pointer to function of parameter is void and return value is int (指向一个函数的指针,这个函数参数为空,返回值为整数)

2.指针所指物的类型是什么?

很简单,指针本身的类型去掉 “*”号就可以了,分别如下:

int

int*

int ()[3]

int ()()

3和4有点怪,不是吗?请擦亮你的眼睛,在那个用来把“*”号包住的“()”是多余的,所以:

int ()[3]就是int [3](一个拥有三个整数的数组)

int ()()就是int ()(一个函数,参数为空,返回值为整数)「注2」

注2:一个小小的提醒,第二个“()”是一个运算符,名字叫函数调用运算符(function call operator)。

3.指针的算术运算。

请再次记住:指针不是一个简单的类型,它是一个和指针所指物的类型复合的类型。因此,它的算术运算与之(指针所指物的类型)密切相关。

int a[8];

int* p = a;

int* q = p + 3;

p++;

指针的加减并不是指针本身的二进制表示加减,要记住,指针是一个元素的地址,它每加一次,就指向下一个元素。所以:

int* q = p + 3;//q指向从p开始的第三个整数。

p++;//p指向下一个整数。

double* pd;

……//某些计算之后

double* pother = pd – 2;//pother指向从pd倒数第二个double数。

4.指针本身的大小。

在一个现代典型的32位机器上「注3」,机器的内存模型大概是这样的,想象一下,内存空间就像一个连续的房间群。每一个房间的大小是一个字节(一般是二进制8位)。有些东西大小是一个字节(比如char),一个房间就把它给安置了;但有些东西大小是几个字节(比如double就是8个字节,int就是4个字节,我说的是典型的32位),所以它就需要几个房间才能安置。

注3:什么叫32位?就是机器CPU一次处理的数据宽度是32位,机器的寄存器容量是32位,机器的数据,内存地址总线是32位。当然还有一些细节,但大致就是这样。16位,64位,128位可以以此类推。

这些房间都应该有编号(也就是地址),32位的机器内存地址空间当然也是32位,所以房间的每一个编号都用32位的二进制数来编码「注4」。请记住指针也可以作为值使用,作为值的时候,它也必须被安置在房间中(存储在内存中),那么指

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号