8、C++指针和自由存储空间
计算机程序在存储数据时必须跟踪3中基本属性。
- 信息存储在何处
- 存储的值为多少
- 存储信息是什么类型。
指针是 一个变量,其存储的是值得内存地址
对于常规变量的地址,只需要对变量应用地址运算符(&),就可以获得它的位置;例如,如果home是一个变量,那么&home就是他的地址。
#include "stdafx.h" #include <iostream> //引用库函数 using namespace std; //使用命名空间 struct inflatable { char name[20]; float volume; double price; }; int main() //主函数,程序执行的入口 { int donuts = 6; double cups = 4.5; cout << "donuts value = " << donuts; cout << "and donuts address = " << &donuts << endl; cout << "cups value = " << cups; cout << "and cups address = " << &cups << endl; cin.get(); return 0; //函数返回值 }
结果:
因此,指针名表示的是地址。* 运算符被称为间接值(indirect velue)或解除引用(dereferencing)运算符,将其应用于指针,可以得到该地址存储的值(这和乘法使用的符号相同,C++根据上下文来确定所指的是乘法还是解除引用)
1、指针申明与初始化:
指针声明必须制定指针的数据的类型
int * p_updata
这表明,p_updata的类型为int,由于*运算符被用于指针,因此p_updata变量本身必须是指针。可以这样说,p_updata是指针(地址),而*p_updata是int,而不是指针。
#include "stdafx.h" #include <iostream> //引用库函数 using namespace std; //使用命名空间 struct inflatable { char name[20]; float volume; double price; }; int main() //主函数,程序执行的入口 { int hig = 5; int * pt = &hig; cout << "Value of hig =" << hig << ";Address of hig =" << &hig << endl; cout << "Value of *pt =" << *pt << ";value of pt =" << pt << endl; cin.get(); return 0; //函数返回值 }
结果:
2、指针的危险:
C++在创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。为数据提供空间是一个独立的步骤。
long *fellow; //创建一个指针 *fellow = 223323; //为指针赋值,但是fellow,没有被赋值,所以不知道fellow代表的地址是多少,所以不知道223323将会存储在内存中的哪里。
警告:一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个人确定的、适当的地址。
3、指针和数字
4、使用new来分配内存
在C语言中可以使用malloc()函数来分配内存,在C++中仍然可以,但C++还有更好的方法——new运算符
5、使用delete释放内存
6、使用new创建动态数组