C++程序设计从零开始之指针

C++程序设计从零开始之指针,第1张

C++程序设计从零开始之指针,第2张

排列

前面说了在C++中内存是通过变量来访问的,但是按照前面的解释,在C++中内存只能通过变量来操作,也就是说要操作某个内存,内存的第一个地址必须绑定一个变量名,这是非常不好的。比如有100块内存用来记录100个工人的工资。现在,需要给每个工人增加5%的工资。为了知道每个工人的工资增加了多少,定义了一个变量float a1用它记录第一个工人的工资,然后执行语句a1+= a1 * 0.05 f;,那么a1就是增加的工资。因为有100个工人,所以必须有100个变量来分别记录100份工资。因此,上面需要100个赋值语句,每个语句都有不同的变量名。

变量定义语句float a1需要手工反复编写;100次(每次换一个变量名),无意义的工作。所以,如果你想一次向操作系统申请100*4=400字节的连续内存,那么要修改第I个工人的工资,只需要从第一个地址开始加4*i字节即可(因为float占用4字节)。

为了提供这个功能,C++提出了一个类型数组。即数组是一组数,其中每个数称为对应数组的元素,每个元素的大小必须相等(因为数组中的元素是用固定的偏移量来标识的),即数组表示一组相同类型的数,这些数必须连续存储在内存中。定义变量时,为了表示变量是数组类型,在变量名后加方括号,在方括号中表示要应用的数组元素个数,以分号结束。因此,记录100份薪水的变量可以定义为数组变量,如下所示:

浮动a[100];

上面定义了一个变量A,分配100*4=400字节的连续内存(因为一个float元素占用4个字节),然后把它的第一个地址绑定到变量名A上,变量A的类型叫做float类型的100个元素的数组。变量A对应的内存的内容将解释如下(类型就是如何解释内存的内容):A对应的地址所标识的内存是一个连续内存的第一个地址,刚好大到可以容纳100位float类型的数字。

所以,之前的浮动b;这个定义被认为是定义一个元素的浮点数组变量B。为了能够访问数组中的元素,变量名后跟方括号,方括号中放有一个数字。数字必须是非浮点数,即用二进制源代码或补码表示的数字。如a[5+3]+= 32;也就是说,数组变量A的第5+3个元素的值增加了32。再次重申:

长c = 23float b = a[(c–3)/5]+10,d = a[c–23];

上面b的值是数组变量A的第四个元素的值加10,d的值是数组变量A的第0个元素的值,即C++的数组中的元素是以0为基本序号计数的,即a[0]实际上代表数组变量A中第一个元素的值,之所以是0,是指A加0*4对应的地址就是第一个元素的地址。

需要注意的是,不能这样写:long a[0];定义一个0元素的数组是没有意义的,编译器会报错。但是,在结构或类或联合中满足某些规则后,可以这样写。那是C语言时代提出的一种实现结构类型变长的技术,C++从零(IX)开始讲解。

还需要注意的是,定义数组时变量不能写在方括号内,即long b = 10浮动a[b];这是错误的,因为在编译这段代码时,不可能知道变量B的值是什么,因此也不可能分配内存。但是,前面写的很清楚,b = 10为什么还说不知道b的值?那是因为不可能知道B对应的地址是什么。因为编译器在编译的时候只是把B绑定到一个偏移量上,并不是真正的地址,也就是B对应的地址可能是Base-54,里面的Base是程序一开始执行的时候动态应用到操作系统的一大块内存的尾地址。因为可能会变化,所以无法知道B的实际对应地址(其实在Windows平台下,由于虚拟地址空的应用,可以得到实际对应的虚拟地址)。

但是编译器仍然可以遵循前面的长b = 10基数为54的值是10?重点是编译器看到长b = 10,只知道生成一条指令,这条指令将10存入基-54的存储器中,其他的就不再问(也不必问),所以即使只写了长b = 10编译器也不知道b的值。

说array是类型并不准确,实际上应该是——array是一个类型修饰符,它定义了一个类型修改规则。类型修饰符将在后面详述。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++程序设计从零开始之指针

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情