📜  C++指针

📅  最后修改于: 2020-09-25 05:06:50             🧑  作者: Mango

在本教程中,我们将在示例的帮助下了解C++中的指针及其使用。

在C++中,指针是存储其他变量的内存地址的变量。

C++地址

如果程序中有变量var ,则&var将在内存中提供其地址。例如,

示例1:在C++中打印变量地址

#include 
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 *pointVar;

在这里,我们声明了一个int类型的指针pointVar

我们还可以通过以下方式声明指针。

int* pointVar; // preferred syntax

让我们再举一个声明指针的例子。

int* pointVar, p;

在这里,我们声明了一个指针pointVar和一个普通变量p

注意:在数据类型之后使用* 运算符来声明指针。

给指针分配地址

这是我们如何为指针分配地址:

int* pointVar, var;
var = 5;

// assign address of var to pointVar pointer
pointVar = &var

在此,将5分配给变量var 。并且,使用代码pointVar = &varvar的地址分配给pointVar指针。

使用指针从地址获取值

为了获得指针指向的值,我们使用* 运算符。例如:

int* pointVar, var;
var = 5;

// assign address of var to pointVar
pointVar = &var

// access value pointed by pointVar
cout << *pointVar << endl;   // Output: 5

在上面的代码中,var的地址分配给pointVar 。我们已经使用*pointVar来获取存储在该地址中的值。

*与指针一起使用时,它称为取消引用运算符 。它对指针进行操作,并给出指针中存储的地址所指向的值。也就是说, *pointVar = var

注意:在C++中, pointVar*pointVar完全不同。我们不能做类似*pointVar = &var;

示例2:C++指针的工作

#include 
using namespace std;
int main() {
    int var = 5;

    // declare pointer variable
    int* pointVar;

    // store address of var
    pointVar = &var

    // print value of var
    cout << "var = " << var << endl;

    // print address of var
    cout << "Address of var (&var) = " << &var << endl
         << endl;

    // print pointer pointVar
    cout << "pointVar = " << pointVar << endl;

    // print the content of the address pointVar points to
    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 
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;

// Wrong! 
// varPoint is an address but var is not
varPoint = var;

// Wrong!
// &var is an address
// *varPoint is the value stored in &var
*varPoint = &var

// Correct! 
// varPoint is an address and so is &var
varPoint = &var

 // Correct!
// both *varPoint and var are values
*varPoint = var;

推荐读物