下面看看如何使用指针来管理运行阶段的内存空间分配。
指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。在这种情况下,只能通过指针来访问内存。
在C语言中,可以用库函数malloc()来分配内存,在C++中仍然可以这样做,但C++还有更好的方法——new运算符。
下面试试这种新技术,在运行阶段为一个int值分配未命名的内存,并使用指针来访问这个值。这里的关键所在是C++的new运算符。程序员要告诉new,需要为哪种数据类型分配内存;new将找到一个长度正确的内存块,并返回该内存块的地址。程序员的责任是将该地址赋给一个指针。下面是一个这样的示例:
int *pn = new int;
new int 告诉程序,需要适合存储int的内存。new运算符根据类型来确定需要多少字节的内存。然后,找到这样的内存并返回其地址。接下来,将地址赋给pn,pn是被声明为指向int的指针。
将这种方法与将变量的地址赋给指针进行比较:
- int higgens;
- int * pt = &higgens;
上述两种情况都是将一个int变量的地址赋给了指针。在第二种情况下,可以通过名称higgens来访问该int,在第一种情况下,则只能通过该指针进行访问。
pn指向的内存没有名称,如何称呼它呢?我们说pn指向一个数据对象,这里的“对象”不是“面向对象编程”中的对象,而是一样“东西”。术语“数据对象”比“变量”更通用,它指的是为数据项分配的内存块。
为一个数据对象(可以是结构,也可以是基本类型)获得并指定分配内存的通用格式如下:
typeName * pointer_name = new typeName;
需要在两个地方指定数据类型,用来指定需要什么样的内存和用来声明合适的指针。
- //4.17如何将new用于两种不同的类型
- #include
- using namespace std;
-
- int main()
- {
- int nights = 1001;
- int *pt = new int;//在程序运行时进行
- *pt = 1001;
-
- cout << "nights value = " << nights << ": location " << &nights << endl;
- cout << "int value = " << *pt << ": location = " << pt << endl;
-
- double *pd = new double;
- *pd = 10000001.0;
-
- cout << "double value = " << *pd << ": location = " << pd << endl;
- cout << "location of pointer pd: " << &pd << endl;//&pd为指针本身的地址
-
- cout << "size of pt = " << sizeof(pt) << ": size of *pt " << sizeof(*pt) << endl;
- cout << "size of pd = " << sizeof(pd) << ": size of *pd " << sizeof(*pd) << endl;
-
- system("pause");
- return 0;
- }