一、搞清关键
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;
}