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 赋值给变量 varvar的地址通过代码 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

C++ 指针的工作
C++ 指针的工作的工作原理

改变指针指向的值

如果 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;

相关教程