指针是一个变量,存储值的地址,使用 & 获取位置。示例:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int num = 6;
  6. cout << num << &num << endl;
  7. }

输出: 6 0x0065fd40 //显示地址时,cout 默认使用十六进制表示法,因为这是常用于描述内存的表示法。

使用常规变量时,值是指定的量,而地址为派生量。下面看看指针策略:

指针与C++基本原理 OOP强调的是在运行阶段(而不是编译阶段)进行决策。运行阶段决策提供了灵活性,可以根据当时的情况进行调整。例如,在程序运行后,可以这次告诉它只需要20个元素,而还可以下次告诉它需要205个元素。

C++采用的方法是,使用关键字 new 请求正确数量的内存以及使用指针来跟踪新分配的内存的位置。

在指针上使用 * 解除引用(dereferencing)运算符可以得到该地址存储的值。示例:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a = 6;
  6. int *b = &a;
  7. cout << a << *b << end;
  8. }

4.7.1 声明和初始化指针

示例:

  1. int *ptr; //C风格
  2. int* ptr; //C++风格
  3. int* p1, p2; //声明一个指针p1、一个int变量p2

对每个变量名,都需要使用一个 *。

4.7.2 指针的危险

在C++中创建指针时,计算机会分配存储地址的内存,但不会分配指针所指向的数据的内存。示例:

  1. long* num;
  2. *num = 223323;

num 指向哪里呢?由于没有初始化,可能指向任何地方。这样的话,赋值 223323 就危险了。

4.7.3 指针和数字

指针不是整型,它们是两个截然不同的类型。要想将数字作为地址使用,必须强制转换:

  1. int* ptr = (int*)0xB8000000;

4.7.4 使用 new 分配内存

C 使用 malloc(),而 C++ 使用 new 运算符。

常规变量声明分配的内存块在被称为栈(stack)的内存区域中,而 new 从被称为堆(heap)或自由存储区(free store)的内存区域分配内存。

4.7.5 使用 delete 释放内存

示例:

  1. int* ps = new int;
  2. //...
  3. delete ps;

释放 ps 指向的内存,并不会删除指针 ps 本身。可以将 ps 重新指向内一个新分配的内存块。

4.7.6 使用 new 创建动态数组

在运行时创建的数字称为动态数组(dynamic array)。示例:

  1. int* psome = new int[10];
  2. //...
  3. delete [] psome;

new 返回第一个元素的地址,上述代码中,首元素的地址赋给 psome。另外,对空指针应用 delete 是安全的。不能使用 sizeof 来确定动态数组的字节数。