在计算机存储数据时必须要知道三个基本要素:信息存储在何处?存储的值为多少?存储的值是什么类型?因此指针是表示信息在内存中存储地址的一类特殊变量,指针和其所指向的变量就像是一个硬币的两面。指针一直都是学习C语言的难点,在C++中又多了一个引用的概念。初学时很容易把这两个概念弄混,下面就来通过一些例子来说明二者之间的差别。
1、指针的声明
上文中提到,指针和其所指向的变量就像硬币的两面,因此通过取址符号*”&”我们可以找到变量的地址,通过解引用符号“*”*可以找到地址内存放的变量值。
int data = 10; //声明了一个变量data,并赋初始值10,存储的值是int类型
int* p_data = &data; //找到 data 在内存中存放的位置,即p_data
cout << "地址为:" << int(p_data) << "\t 存放的值为:" << data << endl;
输出结果为:
地址为:8191436 存放的值为:10
地址默认是16进制,我们在输出时将其转换成了int 类型,因此以十进制输出。输出结果翻译过来就是:在地址编码为8191436的位置存放了值为10的变量data,再进一步地说,data与*p_data 表示同一个东西。为了更有助于理解,我们绘制了下图:
因此从本质上看,指针与普通的变量并没有什么太大的区别,只是指针变量可以通过解引用的方式找到指针所对应的地址中存放的数值。假如定义如下:
int data = 10;
int* p_data = &data; //定义指向 int 类型的指针 p_data, 存储的是 int 类型的变量 data的地址,其
int** p_p_data = &p_data; //定义指向 int* 类型的指针 p_p_data, 存储的是 int* 类型的变量 p_data的地址
cout << "p_data:" << p_data << "\t 存放的值为:" << *p_data << endl;
cout << "p_p_data:" << p_p_data << "\t 存放的值为:" << *p_p_data << endl;
输出结果为:
p_data:00EFF96C 存放的值为:10
p_p_data:00EFF960 存放的值为:00EFF96C
从输出结果可以看出ÿ