指针是一个变量,存储值的地址,使用 & 获取位置。示例:
#include <iostream>
using namespace std;
int main()
{
int num = 6;
cout << num << &num << endl;
}
输出: 6 0x0065fd40 //显示地址时,cout 默认使用十六进制表示法,因为这是常用于描述内存的表示法。
使用常规变量时,值是指定的量,而地址为派生量。下面看看指针策略:
指针与C++基本原理 OOP强调的是在运行阶段(而不是编译阶段)进行决策。运行阶段决策提供了灵活性,可以根据当时的情况进行调整。例如,在程序运行后,可以这次告诉它只需要20个元素,而还可以下次告诉它需要205个元素。
C++采用的方法是,使用关键字 new 请求正确数量的内存以及使用指针来跟踪新分配的内存的位置。
在指针上使用 * 解除引用(dereferencing)运算符可以得到该地址存储的值。示例:
#include <iostream>
using namespace std;
int main()
{
int a = 6;
int *b = &a;
cout << a << *b << end;
}
4.7.1 声明和初始化指针
示例:
int *ptr; //C风格
int* ptr; //C++风格
int* p1, p2; //声明一个指针p1、一个int变量p2
4.7.2 指针的危险
在C++中创建指针时,计算机会分配存储地址的内存,但不会分配指针所指向的数据的内存。示例:
long* num;
*num = 223323;
num 指向哪里呢?由于没有初始化,可能指向任何地方。这样的话,赋值 223323 就危险了。
4.7.3 指针和数字
指针不是整型,它们是两个截然不同的类型。要想将数字作为地址使用,必须强制转换:
int* ptr = (int*)0xB8000000;
4.7.4 使用 new 分配内存
C 使用 malloc(),而 C++ 使用 new 运算符。
常规变量声明分配的内存块在被称为栈(stack)的内存区域中,而 new 从被称为堆(heap)或自由存储区(free store)的内存区域分配内存。
4.7.5 使用 delete 释放内存
示例:
int* ps = new int;
//...
delete ps;
释放 ps 指向的内存,并不会删除指针 ps 本身。可以将 ps 重新指向内一个新分配的内存块。
4.7.6 使用 new 创建动态数组
在运行时创建的数字称为动态数组(dynamic array)。示例:
int* psome = new int[10];
//...
delete [] psome;
new 返回第一个元素的地址,上述代码中,首元素的地址赋给 psome。另外,对空指针应用 delete 是安全的。不能使用 sizeof 来确定动态数组的字节数。