C++中的指针/引用/数组

C++的指针 引用 数组三者关系迁徙

1. 指针和引用

在C++中,我觉得指针和引用是很容易弄混的,大概是因为这两者真的太像了。
声明一个引用和声明一个指针

int a = 100;
int &reference_a = a;
int *pointer_a = &a;
int *pointer = 100;  

你就说这像不像,声明指针也要用到&,不过就是一个在左边,一个在右边。
这就是所谓的某些符号具有多种意义

C++ primer plus P48 有讲到 后续再补上
像&和*这样的符号,既可以做表达式中的运算符,也可以作为声明的一部分出现,符号的上下文决定了符号的意义
int i = 42;
int &r = i; //

理解了运算符这层面,我们再来理解下引用的指针。
引用:是某个对象的别名。
指针:是一个对象,存放这某个对象的地址。指向常量的指针不能用来改变它所指对象的值。
对象又是咩呢?
对象:是内存的一块区域,具有某种类型,变量是命名了的对象。
简单来说,对象相当与药柜子里的药,这药本来是有它的名字的,比如说“田七”。可我就不爱这样叫它,我要叫它小七。所以引用就相当于“小七”这个别名。
指针呢,相当于啥呢?这个柜子在第五个柜子的第三层的右边数第四个。太麻烦了,可我又经常要去拿这个柜子里的东西,所以我用一个小开关,给我直接打开(5,3,4)位置的柜子把药给我拿过来。
指针就是存这个地址的开关,它也是个对象。
这样基本就清楚了,指针和引用的区别其实也就很明显了。

2. 指针和引用的区别

指针是一个对象,而引用就是一个别名。所以指针声明时可以不初始化,我开关不急着打开哪个柜子,哪个柜子都ok。我叫小名不行啊,我不能叫王八叫小七吧。
总结起来:

  1. 指针是一个对象,引用不是;
  2. 指针可以多次指向不同的对象,而引用不行;
  3. 指针可以不初始化,但引用不行

3.数组和指针的关系

说到数组和指针的关系,就一定要说说数组的烦人的地方:

不允许拷贝和赋值

举个栗子

int a[] = {0,1,2}
int a2[] = a; // 错误:不允许使用一个数组初始化另一个数组
a2 = a; //错误:不允许把一个数组直接赋值给另一个数组

然后我们再讲讲数组和指针,你就会发现这些烦人的地方其实也有很好的作用:
在很多用到数组名字的地方,编译器都会自动将其替换成一个指向数组首元素的指针

int a[] = {0,1,2}
int* pa = a; // pa是一个整型指针,指向a的第一个元素

所以这也就是一个很神奇的问题

int ia[] = {0,1,2,3,4,5,6,7,8,9,10}
auto ia2(ia); //等价于auto ia2(&ia[0])
直接指向数组的指针

这里用一个例子做个对比

int a[2] = {1,2};
int (*temp1)[2] = a; //声明指向数组的指针
int *temp2 = a; //声明指向数组首地址的指针
 // 访问元素的方式不同
 std::cout << (*temp1)[0]  << std::endl;
 std::cout << temp2[0]  << std::endl;
 // 类型不同还有一个地方
 std::cout << ++temp1<< std::endl; //会加8
 std::cout << ++temp2 << std::endl; //会加4

4.数组和引用的关系

大致了解以下声明就好

int a[2] = {1,2};
int (&temp)[2] = a;
int &temp2[2] = a; //注意不存在引用的数组,因为引用要在声明时初始化,且非常量引用不能指向临时值

大概就是这样子了,虽然写的有点乱,但希望大家看完能对指针,数组,引用的关系有点收获

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值