C++指针和引用

引用

是内存空间另外一个别名,相当于门牌号,可以用它来找到具体的内存空间。

int i = 17;
int &b = i;
cout << b << endl;

指针

指针指向一块内存,它的内容是所指内存的地址

int i = 17;
int* p = &i; //指针
cout << *p << endl;

引用和指针的区别

  1. 指针是一个实体,而引用仅是个别名;
  2. 引用使用时无需解引用(*),指针需要解引用;
  3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
  4. 引用没有 const,指针有 const,const 的指针不可变;
  5. 引用不能为空,指针可以为空;
  6. sizeof 引用得到的是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身(所指向的变量或对象的地址)的大小。
  7. 指针和引用的自增(++)运算意义不一样;

值交换

指针值交换

void swap_1(int *a,int *b){
	int c = 0;
	c = *a;
	*a = *b;
	*b= c;
}  

引用值交换

void swap_2(int &a,int &b){
	int c = 0;
	c = a;
	a = b;
	b = c;
}  
引用的主要功能:作为函数的参数或返回值
struct Treacher{
	char* name;
	int age;
};

void myprint(Treacher &t){
	t.age = 21;
	cout << t.name << "," << t.age << endl;
}

指针作为函数的参数或返回值就稍微要麻烦一些

void myprint2(Treacher *t){
	t->age = 22;
	//(*t).age = 22; //和t->age相同
	cout << t->name << "," << t->age << endl;
}  

二级指针和指针引用

二级指针

void getTeacher(Teacher **p){
	Teacher *tem = (Teacher *)malloc(sizeof(Teacher));
	tem->age = 20;
	*p = tem;
}  

指针引用,代替二级指针

void getTreacher2(Treacher* &p){
	p = (Treacher *)malloc(sizeof(Treacher));
	p->age = 20;
}  

指针常量与常量指针

指针常量,指针的常量,不改变地址的指针,但可以修改指向的内容
常量指针,指向常量的指针,内容不能修改

void main9(){
	//指针常量,指针的常量,不改变地址的指针,但可以修改指向的内容
	int a = 2, b = 3;
	int *const p1 = &a;
	//p1 = &b; //指针常量, 无法改变地址
	*p1 = 4; //可以这样改变

	//常量指针,指向常量的指针,内容不能修改
	const int *p2 = &a;
	p2 = &b; //可以这样改变
	//*p2 = 9; //常量指针,无法改变内容
}

引用的大小

struct Treacher{
	char* name;
	int age;
};

void main(){
	Treacher t;
	Treacher &t1 = t;
	Treacher *p = &t;

	cout << sizeof(t1) << endl; //引用是结构体内所有字段大小的综合 char* 4字节,int 4字节,总共8字节
	cout << sizeof(p) << endl; //指针是4
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值