指针和引用的区别
-
指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用仅是个别名;
-
引用使用时无需解引用(*),指针需要解引用;
-
引用只能在定义时被初始化一次,之后不可变;指针可变;
//指针
int a = 1;
int c = 2;
int *b = &a;
cout<<*b<<endl;
a--;
cout<<*b<<endl;
b=&c;
cout<<*b<<endl;
c++;
cout<<*b<<endl;
结果:
1 //a = 1 , *b = 1 , c = 2
0 //a = 0 , *b = 0 , c = 2
2 //a = 0 , *b = 2 , c = 2
3 //a = 0 , *b = 3 , c = 3
//引用
int a = 1;
int c = 2;
int &b = a;
cout<<b<<endl;
a--;
cout<<b<<endl;
b=c;
cout<<b<<endl;
c++;
cout<<b<<endl;
结果:
1 //a = 1 , b = 1 , c = 2
0 //a = 0 , b = 0 , c = 2
2 //a = 2 , b = 2 , c = 2
2 //a = 2 , b = 2 , c = 3
- 引用没有 const,指针有 const;
顺带提一下 const char * ,char const *,char * const 三者的区别
const char *p; // 声明一个指向字符或字符串常量的指针(不可通过指针p去修改p指向的内容)
char const *p;// 等同于 chonst char *
char * const p;//声明一个指向字符或字符串的指针常量,即不可以修改p的值,也就是地址无法修改。
//记忆方法:const 修饰p=>p的值不能变=>p的指向无法修改
- 引用不能为空,指针可以为空;
结合上述第三点,引用只会在定义时初始化一次,所以引用为空不合理
int *t = NULL;//nullptr
- “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
double a = 1;
double* b = &a;
double& c = a;
cout<<sizeof(b)<<" "<<sizeof(c)<<endl;
结果:
4 8
指针大小为4,引用大小为8
- 指针和引用的自增(++)运算意义不一样;
int a = 1;
int b = 2;
int* c =&a;
int* d = &b;
int& e = b;
cout<<c<<" "<<d<<" "<<*d<<" "<<e<<endl;
d++,e++;
cout<<d<<" "<<*d<<" "<<e<<endl;
结果:
0x68fed0 0x68fecc 2 2 //a的地址,b的地址,*d(b)的值,c(b)的值
0x68fed0 1 3//d++,指针++,d的值(即地址值,加上了该数据类型的长度(这里为sizeof(int)=4)),跳跃到了a,也就是此时d指向了a。所以*d(a)=1。
//e++,引用++,相当于存储的值++,所以此时b和e都为3
//题外话:验证了栈空间是由高地址向低地址生长的。
- 指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的(注:当作右值引用当然是可以,但是如果像指针那样去理解则是不对的))
int a = 1;
int *aa= &a;
int **aaa =&aa;
cout<<a<<" "<<aa<<" "<<aaa<<endl;
cout<<*aa<<" "<<**aaa<<endl;
结果:
1 0x68fed8 0x68fed4
1 1
- 从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。
以上内容经过个人网上搜索整理和自我实验得到,若有不对或者有补充欢迎评论里告诉我!