面试常考题:c++中指针和引用的区别?

指针和引用的区别

  1. 指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用仅是个别名;

  2. 引用使用时无需解引用(*),指针需要解引用;

  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 = 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
  1. 引用没有 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的指向无法修改
  1. 引用不能为空,指针可以为空;
结合上述第三点,引用只会在定义时初始化一次,所以引用为空不合理
int *t = NULL;//nullptr
  1. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
    double a = 1;
    double* b = &a;
    double& c = a;
    cout<<sizeof(b)<<" "<<sizeof(c)<<endl;
    结果:
    4 8
    指针大小为4,引用大小为8
  1. 指针和引用的自增(++)运算意义不一样;
    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

//题外话:验证了栈空间是由高地址向低地址生长的。
  1. 指针可以有多级,但是引用只能是一级(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
  1. 从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。

以上内容经过个人网上搜索整理和自我实验得到,若有不对或者有补充欢迎评论里告诉我!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值