**
C++基本类型-----复合类型
复合类型:指基于其他类型定义的类型
1.引用:为对象起的另一个名字,引用类型引用另外一种类型
引用即别名
引用并非对象,相反的,它只是为一个已经存在的对象所起的另一个名字,一般在初始化变量时,初始值会拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定**在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它初始值对象一直绑定在一起。因为无法令引用重新绑定到另一个对象,因此引用必须初始化。
int i = 1024;
int &rei1 = i;//rei指向i(是i 的另一个名字)
int &rei2;//错误,引用必须初始化
rei1 = 2;//把2赋值给rei1指向的对象,此时即是赋值给了i
int ii = rei1;//与ii = i执行结果一样
引用定义
除了const限定符两种例外情况外,其他所有引用类型都要和与之绑定的对象严格匹配。而且,引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起
允许在一条语句中定义多个引用,其中每个引用标识符都必须以符号&开头:
int i = 1024,i2 = 2048;//i 和 i2 都是int
int &r = i,r2 = i2;//r是一个引用,与i绑定在一起,r2是int
int i3 = 1024,&ri = i3;//i3 是int,ri 是一个引用,与i3绑定再一起
int &r3 = i3,&r4 = i2;//r3和r4都是引用
int &rei4 = 10;//错误:引用类型的初始值必须是一个对象
double d = 3.14;
int &rei5 = d;//错误:此处引用类型的初始值必须是int型对象
**2.指针:指向另外一种类型的复合类型。
与引用类似,指针也实现了堆其他类型的间接访问,指针和引用的不同点:一、指针本身是对象,允许指针赋值和拷贝,而且在指针的生命周期内它可以先后只指向不同的对象。二、指针无须在定义时赋初值。在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值
获取地址
指针存放在某个对象的地址,要想获取该地,需要使用取地址符(操作符&)
int i = 42;
int *p = &i;//p存放变量i 的地址,或者说p 是指向变量i的指针
double d;
double *pd = &d;//正确:初始值是double型对象的地址
double *pd2 = pd;//正确:初始值是指向daouble对象的指针
int pi = pd;//错误:指针pi的类型和pd的类型不匹配
pi = &d;//错误:试图把double型对象的地址赋给int型指针
指针值
指针值应属于四种状态
1.指向一个对象
2.指向紧邻对象所占空间的下一个位置
3.空指针,意味着指针没有指向任何对象
4.无效指针,也就是上述情况之外的其他值
赋值和指针
指针和引用都能提供对其他对象的间接访问,然而在具体实现细节上二者有很大不同,其中最重要的一点是引用本身并非一个对象。一旦定义了引用,就无法令其在绑定到另外的对象,之后每次使用这个引用都是访问它最初绑定的那个对象
给指针赋值令它存放一个新的地址,从而指向一个新的对象
int i = 42;
int *pi = 0;//pi被初始化但没有指向任何对象
int *pi2 = &i;//pi2被初始化,存放i的地址
int *pi3;//如果pi3定义于块内则pi3的值是无法确定的
pi3 = pi2;//pi3 和pi2指向同一个对象i
pi2 = 0;//现在pi2不指向任何对象了
pi = &ival;//pi的值被改变,现在pi指向ival
*pi = 0 ;
void * 指针
void* 是一种特殊的指针类型,可用于存放任意对象的地址。一个void*指针存放着一个地址,这一点和其他指针类似
double obj = 3.14,*pd = &obj;
void *pv = &obj;//void *能存放任意类型对象地址,obj可以是任意类型的对象
pv = pd;//pv可以存放任意类型的指针
本文详细介绍了C++中的两种复合类型——引用和指针。引用作为对象的别名,一旦初始化后不可改变绑定的对象,而指针本身是对象,可以改变指向。同时,文中讨论了两者在内存、类型匹配和使用场景上的差异,并提到了void*指针的特殊用途,即可以存放任意类型对象的地址。
1004

被折叠的 条评论
为什么被折叠?



