[学习笔记]C和C++中指针的基础知识点(二)

       一改往日的燥热,今天天气很凉爽,非常适合在家睡觉(貌似每天都非常适合在家睡觉害羞)。。。不瞎说了,接着昨天讲一些有关指针和数组的基础知识吧。


指针和数组:


       话说,在C++中指针和数组是基本等价的,原因在于指针算数和C++内部处理数组的方式。C++中将数组名解释为地址,多数情况下数组名被解释为数组的第一个元素的地址。在C++中,我们在将指针变量加1后,其增加的值等于指向的类型占用的字节数

       有数组arr[10],则arr[1]和*(arr + 1)是等价的,同样*(arr + 2)和arr[2]也是等价的。通常,使用数组表示法时,C++都执行下面转换:

       arrayname[i] becomes * (arrayname + i)

       若使用的是指针,则C++也将执行同样的转换:

       pointername[i] beacomes * (pointername + i)

       在多数表达式中,数组名和指针名都表示地址,区别之一是,可以修改指针的值,而数组名是常量,可以将数组名理解为一个const型的指针。

       另一个区别是,数组应用sizeof运算符得到的是数组的长度,而指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组,这时C++不会将数组名解释为地址。


数组的地址:


       对数组取地址时数组名也不会被解释为其地址数组名被解释为其第一个元素的地址而对数组名应用地址运算符时得到的是整个数组的地址

short tell[10];                  //tell数组长20个字节
cout << tell << endl;    //显示tell[0]的地址,即&tell[0]
cout << &tell << endl; //显示整个数组的地址

       从数字上说,这两个地址相同;但从概念上说,&tell[0](即tell)是一个2字节内存块的地址,而&tell是一个20字节内存块的地址。tell+1将地址值加2,而&tell+2将地址值加20。即tell指向一个short类型数据,而&tell指向包含20个元素的short数组(short(*)[20]).

       这里要注意一点,如果要创建一个指向整个数组的指针,一定要注意它的括号:

short (*pas)[20] = &tell;  //pas指向含有20个short型数据的数组

       如果省略括号,优先级规则将使得pas先与[20]结合,导致pas是一个short指针数组。由于pas被设置为&tell,因此*pas和tell等价,所以(*pas)[0]为tell数组的第一个元素。

       总之,使用new来创建数组以及使用指针来访问不同元素很简单,只要把指针当做数组即可。


       这次先说这么多,再次感谢《C++ Primer Plus》,获益匪浅;非常适合对面向对象不是那么熟悉的同学,调理清晰,由浅入深。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值