C++中的指针pointer

Made by Mike_Zhang


所有相关文章:
C++中的指针pointer - 指针的声明, 取地址运算符号, 指针的赋值, 指针运算符
C++中的指针pointer2 - 指针运算, 指向空的指针与空类型指针, 指向常量的指针与指针常量


1
2
3
4
5
6
#include <iostream>
using namespace std;
void main(){
int a = 2;
printf("%d\n", a);
}

先看一段代码, 这段代码引入了一个整数型变量a,并把它赋值为2, 最后输出. 看上去十分简单, 但仔细思考一下, 程序是怎么知道变量a中到底存了什么数据呢, 或者说怎么去得到变量a中的数据呢? 其实程序通过变量名所对应的内存单元来对数据进行读取. 简单来说, 你的一位朋友想找你, 他不是直接找到你, 而是通过你所在的地址来找到你. 类似的, 程序也是通过变量相对应的内存地址来进行操作, 这时就需要引入一种新的数据类型—指针(pointer).
在C/C++中, 指针(pointer) 是一种特殊的数据类型, 它存储的是数值的内存地址, 指针也称指针变量.

指针的声明

指针的声明和一般的变量声明方式类似

1
2
3
4
数据类型 * 指针变量名
//如:
int * aPointer;
float * bPointer;


取地址运算符号

指针所储存的地址是通过取地址运算符号(address operator) & 来获取的. 如果 home 是一个变量, 那&home 就是家的地址,例如:

1
2
3
int a = 2;
int * aPointer;
aPointer = &a;

这样变量a的内存地址就被读取出来并且存在指针aPointer中了


指针的赋值

有两种赋值方法
1.在声明时赋值:

1
2
int a = 2;
int * aPointer = &a; //声明并赋值

2.在后期赋值:
1
2
3
int a = 2;
int * aPointer; //声明
aPointer = &a; //赋值

注意:
在以上例子中, 指针变量名是aPointer, 不是 *aPointer,
aPointer = &a 指的是把整数型变量a的内存地址赋值给指针变量 aPointer, 若写成 *aPointer = &a, 则程序会报错.


指针运算符

指针运算符和取地址运算符的作用完全相反, 指针运算符(indirect value/dereferencing operator) 可以通过地址取得对应的值. 举例来说, 假设host是一个指针, 那host代表的是地址, *host代表的是那个地址所对应的值. 例如:

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
void main(){
int a = 2;
int * aPointer = &a;
cout << a << endl; //输出整数型变量a的值
cout << *aPointer << endl; //输出整数型变量a所对应的指针所对应的值, 即为a
}

上面例子所输出的两个结果是一样的, 都为2.


小结

1
2
3
4
5
6
7
8
9
10
#include <iostream>
using namespace std;
void main(){
int a = 2;
int * aPointer = &a;
cout << a << endl; //输出整数型变量a的值
cout << *aPointer << endl; //输出整数型变量a所对应的指针所对应的值, 即为a
*aPointer = *aPointer + 1; //使用指针改变原变量的值
cout << a << endl;
}

在这个例子中, 变量a和指针aPointer相当于一枚硬币的两面.
通过取地址运算符&得到变量a的地址, 通过指针运算符 *得到地址所对应的值.
所以说a和 *aPointer是完全一样的, aPointer对应的值为&a. 还可以通过修改 *aPointer来修改a的值.
Two sides of a coin
图源: Prata S - C++ Primer Plus 6th Edition - 2011


引用:
Prata S - C++ Primer Plus 6th Edition - 2011


写在最后

本文只讲了指针变量的简单内容, 之后会继续展开指针运算、指向空的指针和空类型指针、指向常量的指针和指针常量、指针与数组等内容, 会继续更新.
最后,希望大家一起交流,分享,指出问题,谢谢!


原创文章,转载请标明出处
Made by Mike_Zhang




感谢你的支持

C++中的指针pointer
https://ultrafish.io/post/cpp-pointer/
Author
Mike_Zhang
Posted on
October 25, 2020
Licensed under