const是常量的意思,被其修饰的变量不可修改
如果修饰的是类、结构体(的指针),放在数据类型(int)前后没有区别,其成员也不可以更改
const修饰的是其右边的内容
虽然p1不能修改指向,但是可以去修改值
看看汇编
ebp-18H是指针变量p的地址值
lea指针不需要知道单位(只是取地址),mov指令需要在前面+单位(说明取值)
在C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值
在C++中,使用引用(Reference)可以起到跟指针类似的功能
引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)
对引用做计算,就是对引用所指向的变量做计算
在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改变,不能像指针一样在去引用其他变量
可以利用引用初始化另一个引用,相当于某个变量的多个别名
不存在【引用的引用、指向引用的指针、引用数组(如int &arr[3])】
** 引用存在的价值之一:比指针更安全、函数返回值可以被赋值**
因为指针可以修改指向
函数里可以访问外面的值,是对外面的值的操作,而不是仅仅针对函数内部
&符号相当于是取地址
写法:&符号左边是什么类型就是什么引用,&符号右边就是变量的别名=变量名
指针的引用
数组的引用
数组名就是数组首地址,因此可以看做是指向数组首地址的指针(int *)
int * &a=arr 但是arr是一个常量即数组首地址,所以要+个const
引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针
一个引用占用一个指针的大小(在cpu架构为X64下是8字节,x86下是4字节)
不能用sizeof(引用名),这样出来的是被引用的变量占用的大小
**定义:**引用可以被const修饰,这样就无法通过引用修改数据了
const必须写在&符号的左边,才能算是常引用
const引用的特点
1.可以指向临时数据(常量、表达式、函数返回值等)const int &a=30;
2.可以指向不同类型的数据
3.作为函数参数时(此规则也适用于const指针)
✓可以接受const和非const实参(非const引用,只能接受非const实参)
✓可以跟非const引用构成重载
重载
◼当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量
看看汇编,就知道原因了
相同类型时的汇编