跳到主要内容

C++ 指针

提示
  1. 指针的基础:在C++中,指针是存储其他变量的内存地址的变量。使用&操作符可以获取一个变量的内存地址。
  2. 声明和使用指针:可以通过在数据类型后面加上*来声明指针,例如int* pointVar;。通过将变量的地址赋值给指针(例如pointVar = &var;)来初始化指针。
  3. 通过指针访问和修改数据:使用解引用操作符*来访问或修改指针指向的地址中的数据。例如,*pointVar访问或修改了pointVar指向的地址中的数据。

在 C++ 中,指针是存储其他变量内存地址的变量。

C++ 中的地址

如果我们的程序中有一个变量 var,&var 将给出它在内存中的地址。例如,

示例 1:在 C++ 中打印变量地址

#include <iostream>
using namespace std;

int main()
{
// 声明变量
int var1 = 3;
int var2 = 24;
int var3 = 17;

// 打印 var1 的地址
cout << "var1 的地址: "<< &var1 << endl;

// 打印 var2 的地址
cout << "var2 的地址: " << &var2 << endl;

// 打印 var3 的地址
cout << "var3 的地址: " << &var3 << endl;
}

输出

var1 的地址: 0x7fff5fbff8ac
var2 的地址: 0x7fff5fbff8a8
var3 的地址: 0x7fff5fbff8a4

这里,开头的 0x 表示地址是十六进制形式。

请注意,第一个地址与第二个地址相差 4 字节,第二个地址与第三个地址也相差 4 字节。

这是因为在 64 位系统中,int 变量的大小为 4 字节。

注意: 当你运行程序时,可能得不到相同的结果。

C++ 指针

如上所述,指针用于存储地址而不是值。

以下是我们声明指针的方式。

int *pointVar;

这里,我们声明了一个 int 类型的指针 pointVar。

我们也可以以以下方式声明指针。

int* pointVar; // 更推荐的语法

让我们看另一个声明指针的示例。

int* pointVar, p;

这里,我们声明了一个指针 pointVar 和一个普通变量 p。

注意: 使用数据类型后的 * 运算符来声明指针。

给指针分配地址

以下是我们给指针分配地址的方式:

int* pointVar, var;
var = 5;

// 将 var 的地址分配给 pointVar 指针
pointVar = &var;

这里,5 被分配给变量 var。然后,使用代码 pointVar = &var 将 var 的地址分配给 pointVar 指针。

使用指针获取地址中的值

要获取指针指向的值,我们使用 * 运算符。例如:

int* pointVar, var;
var = 5;

// 将 var 的地址分配给 pointVar
pointVar = &var;

// 访问 pointVar 指向的值
cout << *pointVar << endl; // 输出:5

在上述代码中,var 的地址被分配给 pointVar。我们使用 *pointVar 来获取该地址中存储的值。

* 与指针一起使用时,它被称为解引用运算符。它作用于一个指针并给出指针中存储的地址所指向的值。也就是说,*pointVar = var

**注意:在 C++ 中,**pointVar 和 *pointVar 完全不同。我们不能做像 *pointVar = &var; 这样的事情。

示例 2:C++ 指针的工作原理

#include <iostream>
using namespace std;
int main() {
int var = 5;

// 声明指针变量
int* pointVar;

// 存储 var 的地址
pointVar = &var;

// 打印 var 的值
cout << "var = " << var << endl;

// 打印 var 的地址
cout << "var 的地址 (&var) = " << &var << endl
<< endl;

// 打印指针 pointVar
cout << "pointVar = " <<

pointVar << endl;

// 打印 pointVar 指向的地址内容
cout << "pointVar 指向的地址内容 (*pointVar) = " << *pointVar << endl;

return 0;
}

输出

var = 5
var 的地址 (&var) = 0x61ff08

pointVar = 0x61ff08
pointVar 指向的地址内容 (*pointVar) = 5

C++ 指针的工作原理

更改指针指向的值

如果 pointVar 指向 var 的地址,我们可以通过 *pointVar 更改 var 的值。

例如,

int var = 5;
int* pointVar;

// 分配 var 的地址
pointVar = &var;

// 更改 pointVar 地址处的值
*pointVar = 1;

cout << var << endl; // 输出:1

这里,pointVar 和 &var 有相同的地址,当 *pointVar 被更改时,var 的值也会随之改变。

示例 3:更改指针指向的值

#include <iostream>
using namespace std;
int main() {
int var = 5;
int* pointVar;

// 存储 var 的地址
pointVar = &var;

// 打印 var
cout << "var = " << var << endl;

// 打印 *pointVar
cout << "*pointVar = " << *pointVar << endl
<< endl;

cout << "将 var 的值更改为 7:" << endl;

// 将 var 的值更改为 7
var = 7;

// 打印 var
cout << "var = " << var << endl;

// 打印 *pointVar
cout << "*pointVar = " << *pointVar << endl
<< endl;

cout << "将 *pointVar 的值更改为 16:" << endl;

// 将 var 的值更改为 16
*pointVar = 16;

// 打印 var
cout << "var = " << var << endl;

// 打印 *pointVar
cout << "*pointVar = " << *pointVar << endl;
return 0;
}

输出

var = 5
*pointVar = 5

将 var 的值更改为 7
var = 7
*pointVar = 7

*pointVar 的值更改为 16
var = 16
*pointVar = 16

使用指针时的常见错误

假设,我们希望指针 varPoint 指向 var 的地址。那么,

int var, *varPoint;

// 错误!
// varPoint 是一个地址,但 var 不是
varPoint = var;

// 错误!
// &var 是一个地址
// *varPoint 是 &var 中存储的值
*varPoint = &var;

// 正确!
// varPoint 是一个地址,&var 也是
varPoint = &var;

// 正确!
// *varPoint 和 var 都是值
*varPoint = var;

推荐阅读