C++ 指针
- 指针的基础:在C++中,指针是存储其他变量的内存地址的变量。使用
&
操作符可以获取一个变量的内存地址。 - 声明和使用指针:可以通过在数据类型后面加上
*
来声明指针,例如int* pointVar;
。通过将变量的地址赋值给指针(例如pointVar = &var;
)来初始化指针。 - 通过指 针访问和修改数据:使用解引用操作符
*
来访问或修改指针指向的地址中的数据。例如,*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
更改指针指向的值
如果 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;
推荐阅读: