启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情
之前聊了C++的引用,是一种给已存在对象起别名的引用类型,C++当中还有一种叫做指针的复合类型,也可以实现对其他对象的间接访问。那么我们就来聊聊C++的指针吧。
指针定义
这里需要先了解一下计算机存储的概念:计算机的内存可以看作是一个紧密排列的数据序列,每一小块数据序列,每一小块数据(也就是字节)的旁边都有一个编号代表数据地址。就好像在生活当中的房子的地址是类似的,不论谁住在这个房子里,这个房子始终会有一个固定的地址(哎,租房的朋友们是不是很有感触)。
指针(Pointer),从其英文字面上来理解就是一个指向某一物件的东西,在程序中就是指向数据的地址(Address)。和之前聊的引用相比,首先二者都可以实现间接访问其他对象的功能,但是相较于引用:
1、就是一个对象,可以进行赋值和拷贝,并且可以指向不同的对象,而引用只是一个别名。
2、指针可以不定义初始值,引用不可以(之前试过)
当然这是目前了解到二者定义来区分的,在之后的学习当中还会有很多涉及到的区别,需要一起总结。
声明
先上一段代码吧。
#include <iostream>
#include <typeinfo>
using namespace std;
int main(){
int num = 1;
int *p; //声明一个指针
int *d = # //声明一个指针指向num对象,但是num需要使用取地址符。
cout << num << ":" << typeid(num).name() << endl;
cout << d << ":" << typeid(d).name() << endl;
cout << *d << << endl; //指针使用解引用符指向对象
return 0;
}
这里要注意的是:
1、声明指针只需要再变量前面加*,但是指针具体指向一个地址的时候,需要对被指向的对象使用取地址符(&) ,这里要和引用区分开来。
2、指针确实指向的是地址,但是也可以指向访问对象,这个使用就需要使用解引用符(*)
3、指针也是需要类型对应的,一个int类型的指针是无法指向一个char类型的变量的。
4、更要注意的是,我们最近频繁使用的 &,*再不同情况下的含义是不一样的,一定要练习区分:
int num = 1;
int &i = num; //这里&代码引用
int *p; //这里*代表指针
p = # //承接上一步,这里&代码取地址符
cout << *p << << endl; //这里*是解引用符