指针
复合类型
复合类型是指基于其他类型定义的类型。
定义复合类型的变量要比定义一般类型复杂很多。
一条声明(declear)语句由一个基本数据类型(例如int,doubble)和紧随其后的一个声明符列表组成。
每个声明符命名了一个变量并指定该变量为与基本数据类型有关的某种类型。
引用和指针是c++中的两种复合类型。
引用
**引用(reference)**为对象起了另外一个名字,引用类型引用另外一种类型。
通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名:
eg:
int ival = 1024;
int &refVal = ival; //refVal指向ival(是ival的一个名字),加了&的refVal是引用型变量。
int &refVal2; //报错,引用必须被初始化(必须要有一个本体)
要注意,引用并非对象,它只是为一个已经存在的对象所起的另外一个名字。
因此,引用的初始值必须是一个已存在的对象,不能定义引用的引用;对引用赋值即对引用的本体赋值。
指针
指针是指向另外一种类型的复合类型。它与引用类似,指针也实现了对其他对象的间接访问。
与引用的不同点:1.指针本身就是一个对象,允许对指针赋值和拷贝,在其存在时可以先后指向几个不同的对象
2.指针无需在定义时赋初值,如果不初始化一个指针,它就像其它变量一样是一个未知的值
eg:
int *ip1,*ip2;//ip1和ip2都是指向int类型的指针
double dp,*dp2;//dp是doubble型对象,dp2是指向dobble型对象的指针
获取对象的地址
使用取地址符"&",来获取对象的地址。(注意不要与引用搞混)
eg:
int ival=42;
int *p=&ival;//p是指向变量ival的指针,其中存放ival的地址
注意,指针的类型要与它指向对象的类型严格匹配,声明指针用*号,使用时不用。
指针值
指针的值(地址),有4种状态:
1.指向一个对象
2.指向紧邻对象所占空间的下一个位置
3.空指针,指针不指向任何一个对象
4.无效指针,是上述其他情况之外的值
利用指针访问对象
使用解引用符来访问指针指向的对象
eg:
int ival=42;
int *p=&ival;
cout<<*p;//输出结果为ival指向的值
因此,对*p赋值就是对p所指的对象赋值,这点与引用类似
获得空指针
空指针不指向任何对象,以下是方法
int *p1=nullptr;//最常用的方法
int *p2=0;//直接将p2初始化为字面值常量0,需要#include cstdlib
int *p3=null;
如果我们定义一个int型变量=0,不能直接把该变量赋给指针,指针通常只能存放地址。
指针一定要记得初始化!!!!!!
指针的赋值
首先,记住:赋值永远是等号右边赋给左边
int i=42;
int *pi=0; //pi被初始化,但没有指向任何对象
int *pi2=&i; //pi2被初始化为指向i的指针
int *pi3; //pi3中的值是未知的
pi3=pi2; //将pi2指向的对象赋给pi3
pi2=0; //pi2不指向任何对象
一些易混的东西(关于*和&)
int i = 42;
int &r = i; //&紧随类型名出现,为定义引用型变量
int *p; //*紧随类型名出现,为定义指针型变量
p = &i; //&出现在表达式中,为取地址符
*p = i; //*出现在表达式中,为解引用符
int &r2 = *p; //&是声明的一部分,*为解引用符
可以将*解引用符理解为对指针的寻址,即我知道了你家的地址,并通过解引用操作把你本人传唤过来,对你本人进行操作。