指针
一、搞清关键
int i = 10, *p = &i;
- 说法:指针 = 指针变量
- 指针的地址:指针变量在内存中的地址,获取方式为:&p
- 指针指向的对象的地址:等价于指针变量的内容,是指针变量所占的内存空间中的内容,获取方式为:p 或 &i
- 指针 p 指向变量 i:指针变量 p 的值(p的值就是p所占内存空间的内容)为变量 i 的地址
- 不初始化指针:该指针(变量)所占的内存空间中的内容作为该指针的初始值,即被看作一个地址值
【指针既是类型也是变量??】
指针:指向另一种类型的复合类型,即指针是一种类型
譬如说,我们定义指针变量 p:int *p;
我们往往称 p 为指针 p,但若我们定义整形变量 i:int i;
我们不会称 i 为整型 i,而是称为变量 i
其实我们所谓的“指针 p”相当于“指针变量 p”,所以我们以后在谈到指针时,就直接将指针视为指针变量,潜在之意是谈到指针,不要想它是一个类型,只想它是一个变量即可。
于是,一系列名词来袭:“指针指向”=“指针变量的值为”、“空指针”=“指针变量变量的值为0”、“初始化指针”=“初始化指针变量”
二、空指针
- 空指针不指向任何对象(因为将其内存空间的值定义为0了,也即该指针指向地址为0的内存空间)
【生成空指针的几种方法】
//way 1 int *p1 = nullptr; //等价于int *p1 = 0; //way 2 int *p2 = 0; //通过将指针初始化为字面值0来生成空指针 //way 3 int *p3 = NULL; //等价于int *p3 = 0;
【nullptr】
- 字面值,用它来初始化指针是得到空指针最直接的方法。
- nullptr 是一种特殊类型的字面值,它可以被转换成任意其他的指针类型。
【NULL】
- 预处理变量,可以用它来给指针赋值,它是在头文件 cstdlib 中定义的,它的值就是0。
三、示例
题目:编写一个函数,使用指针形参交换两个整数的值。
#include <iostream> #include <vector> #include <string> using std::cin; using std::cout; using std::endl; using std::vector; using std::string; void swap(int *p1, int *p2) { int tmp; tmp = *p1; *p1 = *p2; //改变P1所指对象的值 *p2 = tmp; } int main() { int a, b; while (cin >> a >> b) { cout << "交换前:a = " << a << ", b = " << b << endl; swap(&a, &b); cout << "交换后:a = " << a << ", b = " << b << endl; } return 0; }