C++复合类型(compound type)——引用和指针的区别
1.引用即别名
声明语句中,类型名 &
组成复合类型-引用,是对已存在的对象起了另外一个名字。
int i=1024;
int &ri=i;//&紧随类型名,因此是声明的部分,ri是对i的引用
int &ri2;// 报错:未初始化
&出现在表达式中时,为取址符
2.指针
声明语句中,类型名 *
组成复合类型-指针
*出现在表达式中时,为解引用符
#include<iostream>
int main()
{
int i = 1024,j=9;
int* p;
int* p1;
p1 = &j;//p1初始化为指向j的指针(地址)
p = &j;//p初始化为指向j的指针
*p = i;//p指向的地址内的值赋为i=1024
std::cout << *p<< " " << *p1<< std::endl;//此时p1和p指向的地址的值都变为1024
return 0;
}
指针和引用的区别:
定义上来说:
- 指针是指向其他任意类型;
- 引用是对象的另一名称。
关键区别:
- 引用是对已存在的对象起另一个名字,指针是对象自己的地址;
- 一旦初始化,引用和初始化对象绑定,且无法解绑对其他对象引用,但是指针可以另分配或者复制;
- 引用一直绑定在初始化对象,但指针在其作用域可以指向数个不同的对象;
- 引用一定要初始化,指针定义时可以不初始化(但使用时最好初始化,否则出现难易预计的错误,对实在不清楚指向的指针,可以先初始化为nullptr或0)
特殊指针类型-void*
可存放任意对象的地址:
int i = 42;
void *p = &i;//合法,void*可任意对象类型
long *lp = &i;//不合法long*不能被int*赋值