在 C++ 中,指针是存储其他变量内存地址的变量。
C++ 中的地址
我们程序中声明的每个变量在内存中都有一个关联的位置,我们称之为变量的内存地址。
如果我们的程序有一个变量 var,&var 将返回它的内存地址。例如,
#include <iostream>
using namespace std;
int main()
{
// declare variables
int var1 = 3;
int var2 = 24;
int var3 = 17;
// print address of var1
cout << "Address of var1: "<< &var1 << endl;
// print address of var2
cout << "Address of var2: " << &var2 << endl;
// print address of var3
cout << "Address of var3: " << &var3 << endl;
}
输出
Address of var1: 0x7fff5fbff8ac Address of var2: 0x7fff5fbff8a8 Address of var3: 0x7fff5fbff8a4
这里,开头的 0x
表示地址是十六进制形式。
请注意,第一个地址与第二个地址相差 4 字节,第二个地址与第三个地址相差 4 字节。
之所以有这个差异,是因为在 64 位系统上,int
的大小是 4 字节。
注意: 运行程序时,您可能不会得到相同的结果。这是因为地址取决于程序运行的环境。
C++ 指针
这里是如何声明指针的
int *point_var;
在这里,我们声明了一个变量 point_var,它是一个指向 int
的指针。
我们也可以这样声明指针
int* point_var; // preferred syntax
为指针分配地址
这里是如何为指针分配地址的
int var = 5;
int* point_var = &var;
这里,5
被赋给了变量 var。并通过代码 point_var = &var
将 var 的地址赋给了 point_var 指针。
注意: 最好在声明指针后立即初始化它们。
使用指针通过地址获取值
要获取指针指向的值,我们使用 *
运算符。例如
int var = 5;
// assign address of var to point_var
int* point_var = &var;
// access value pointed by point_var
cout << *point_var << endl; // Output: 5
在上面的代码中,var 的地址被赋给了 point_var。我们使用 *point_var
来获取存储在该地址的值。
当 *
与指针一起使用时,它被称为解引用运算符。它作用于指针,并给出指针中存储的地址所指向的值。也就是说,*point_var = var
。
注意: 在 C++ 中,point_var 和 *point_var 完全不同。我们不能这样做 *point_var = &var;
。这里,point_var
是一个存储其指向的变量地址的指针,而 *point_var
返回由 point_var 指向的地址所存储的值。
示例 1:C++ 指针的工作原理
#include <iostream>
using namespace std;
int main() {
int var = 5;
// store address of var
int* point_var = &var;
// print value of var
cout << "var = " << var << endl;
// print address of var
cout << "Address of var (&var) = " << &var << endl
<< endl;
// print pointer point_var
cout << "point_var = " << point_var << endl;
// print the content of the address point_var points to
cout << "Content of the address pointed to by point_var (*point_var) = " << *point_var << endl;
return 0;
}
输出
var = 5 Address of var (&var) = 0x61ff08 point_var = 0x61ff08 Content of the address pointed to by point_var (*point_var) = 5

更改指针指向的值
如果 point_var 指向 var 的地址,我们可以使用 *point_var 来更改 var 的值。
例如,
int var = 5;
int* point_var = &var;
// change value at address point_var
*point_var = 1;
cout << var << endl; // Output: 1
这里,point_var 和 &var
具有相同的地址;当 *point_var 被更改时,var 的值也会被更改。
示例 2:更改指针指向的值
#include <iostream>
using namespace std;
int main() {
int var = 5;
// store address of var
int* point_var = &var;
// print var
cout << "var = " << var << endl;
// print *point_var
cout << "*point_var = " << *point_var << endl
<< endl;
cout << "Changing value of var to 7:" << endl;
// change value of var to 7
var = 7;
// print var
cout << "var = " << var << endl;
// print *point_var
cout << "*point_var = " << *point_var << endl
<< endl;
cout << "Changing value of *point_var to 16:" << endl;
// change value of var to 16
*point_var = 16;
// print var
cout << "var = " << var << endl;
// print *point_var
cout << "*point_var = " << *point_var << endl;
return 0;
}
输出
var = 5 *point_var = 5 Changing value of var to 7: var = 7 *point_var = 7 Changing value of *point_var to 16: var = 16 *point_var = 16
这里 point_var 保存 var 的地址,通过使用 *point_var
对 point_var 进行解引用,我们可以访问和修改存储在该地址的值,这反过来又会影响原始变量 var.
使用指针时的常见错误
假设我们希望指针 point_var 指向 var 的地址。那么,
int var = 5;
// Wrong!
// point_var is an address but var is not
int* point_var = var;
// Wrong!
// &var is an address
// *point_var is the value stored in &var
*point_var = &var;
// Correct!
// point_var is an address and so is &var
point_var = &var;
// Correct!
// both *point_var and var are values
*point_var = var;
另请阅读