C++ 指针

在 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 = &varvar 的地址赋给了 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
Working of C++ Pointers
C++ 指针的工作原理

更改指针指向的值

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

另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战