7. 指针和自由存储空间
终于提到指针啦。首先得提一提指针策略,“它是C++内存管理编程理念的核心”:
这个怎么理解呢?面向对象编程OOP强调在运行阶段进行决策,打个比方事先不知道数组里面元素的个数,到使用这个数组时根据具体情况决定元素的个数,或者根据需要来添加或者减少。指针就为完成这一目标提供了基础。
声明和初始化指针:
int * p_updates;
这样就声明了一个指向int数据的指针p_updates。
int higgens = 5;
int *pt = &higgens;
这样就声明了一个指向int数据的指针pt,并用int数据higgens的地址来初始化了pt。
注意,不允许直接将一个内存地址赋予一个指针。
使用new来分配内存
指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。在这种情况下,只能通过指针来访问
int *pn = new int;
*pn = 1001;
对于指针,需要指出的一点是,new分配的内存块通常与常规变量声明分配的内存块不同。常规变量都存储在栈(stack)中,而new从堆(heap)或自由存储区(free store)的内存区域分配内存
当使用完内存后,需要用delete运算符来释放内存
int * ps = new int;
...
delete ps;
一定要配对的使用new和delete。
使用new来创建动态数组
int * psome = new int [10];
delete [ ] psome;
同样可以通过psome[0], psome[1], psome[2]... 等来访问每个元素。
8. 指针,数组和指针算术
将整数变量加1后,其值增加1;将指针变量加1后,增加的量等于它指向的类型的字节数
c++将数组名解释为地址
程序清单4.19 addpntrs.cpp中定义了数组
double wages[3] = {10000.0, 20000.0, 30000.0};
wages则可以认为该数组第一个元素的地址。这样可以定义指针;
double * pw = wages = &wages[0];
这里抄一段原话:
使用new来创建数组以及使用指针来范围不同的元素很简单。只要把指针当作数组名对待即可。然而,要理解为何可以这样做,将是一种挑战。要想真正了解数组和指针,应认真复习他们的相互关系。
指针和字符串
这一小节有点复杂,基本内容为:在cout和多数c++表达式中,char数组名,char指针以及用引号括起的字符串常量都被解释为字符串第一个字符的地址。
具体看第一个例子:
char flower[10] = "rose";
cout << flower << "s are red\n";
这里cout把flower看成flower字符串数组第一个字符'r'的地址,然后打印该地址处的字符'r',然后继续打印后面的字符知道遇到空字符\0为止。
同样cout把“s are red\n"看成第一个字符‘s'的地址
使用new创建动态结构
struct inflatable{
...
};
inflatable *ps = new inflatable;
用->访问结构成员,如ps->price,或者(*ps).price