C++ 指针及其工作原理
在本教程中,我们将学习 C++ 中的指针及其工作原理。
在 C++ 中,指针是存储其他变量的内存地址的变量。
C++ 中的地址
在我们的程序中,如果我们有一个变量 var
, 那么 &var
会给我们它在内存中的地址。例如,
示例 1:在 C++ 中打印变量地址
#include <iostream>
using namespace std;
int main()
{
// declare variables
int var1 = 3;
int var2 = 24;
int var3 = 17;
cout << "Address of var1: "<< &var1 << endl;
cout << "Address of var2: " << &var2 << endl;
cout << "Address of var3: " << &var3 << endl;
}
输出
Address of var1: 0x7fff5fbff8ac
Address of var2: 0x7fff5fbff8a8
Address of var3: 0x7fff5fbff8a4
这里, 0x
开头代表的地址是十六进制形式。
请注意,第一个地址与第二个地址相差 4 个字节,第二个地址与第三个地址相差 4 个字节。这是因为 int
在 64 位系统中变量的大小是 4 个字节。
注意: 您在运行程序时可能不会得到相同的结果。
C++ 指针
如上所述,指针用于存储地址而不是值。下面声明指针的语法。
int *pointVar;
在这里,我们声明了一个 int
类型的指针 pointVar
。
我们还可以通过以下方式声明指针,这也是推荐的语法:
int* pointVar;
让我们再举一个声明指针的例子。
int* pointVar, p;
在这里,我们声明了一个指针 pointVar
和一个正常的变量 p
.
注: 该 *
操作员的数据类型来声明指针后使用。
为指针分配地址
以下是我们如何为指针分配地址:
int* pointVar, var;
var = 5;
// 分配变量地址给指针
pointVar = &var;
这里, 5
赋值给变量 var
, var
的地址通过代码 pointVar = &var
被分配给指针 pointVar
。
使用指针从地址中获取值
要获取指针指向的值,我们使用 *
运算符。例如:
int* pointVar, var;
var = 5;
// 分配 var 的地址给 pointVar
pointVar = &var;
// 访问 pointVar 指向地址中的值
cout << *pointVar << endl; // Output: 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;
pointVar = &var;
cout << "var = " << var << endl;
cout << "Address of var (&var) = " << &var << endl
<< endl;
cout << "pointVar = " << pointVar << endl;
cout << "Content of the address pointed to by pointVar (*pointVar) = " << *pointVar << endl;
return 0;
}
输出
var = 5
Address of var (&var) = 0x61ff08
pointVar = 0x61ff08
Content of the address pointed to by pointVar (*pointVar) = 5
改变指针指向的值
如果 pointVar
指向 var
的地址,我们可以通过使用 *pointVar
改变 var
.
例如,
int var = 5;
int* pointVar;
// assign address of var
pointVar = &var;
// change value at address pointVar
*pointVar = 1;
cout << var << endl; // Output: 1
这里, pointVar
和 &var
具有相同的地址, *pointVar
被改变时 var
的值也将改变。
示例 3:更改指针指向的值
#include <iostream>
using namespace std;
int main() {
int var = 5;
int* pointVar;
// store address of var
pointVar = &var;
// print var
cout << "var = " << var << endl;
// print *pointVar
cout << "*pointVar = " << *pointVar << 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 *pointVar
cout << "*pointVar = " << *pointVar << endl
<< endl;
cout << "Changing value of *pointVar to 16:" << endl;
// change value of var to 16
*pointVar = 16;
// print var
cout << "var = " << var << endl;
// print *pointVar
cout << "*pointVar = " << *pointVar << endl;
return 0;
}
输出
var = 5
*pointVar = 5
Changing value of var to 7:
var = 7
*pointVar = 7
Changing value of *pointVar to 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;
相关教程:
- C++ 指针和数组
- C++ 指针和函数
- C++ 指针和结构体
- C++ Void 指针