C++数组处理以及左值与右值探究

C++对字符数组的处理和一般数组不同,如果不弄清楚,使用过程中就有可能犯迷糊。
那么究竟有什么不同呢?先看下一般数组的情况。

一般数组

    int a[4]{ 1,2,3,4 };
    int b{ 2 };
    cout << a << endl//输出第一个元素地址
        << &a << endl//输出第一个元素地址
        << &a[0] << endl //输出第一个元素地址
        << *(&a) << endl//输出第一个元素地址
        << &(*a) << endl//输出第一个元素地址
        << *a << "  " << *&(*a) << "  " //输出第一个元素
        <<  << "  " << a[0] << endl;//输出第一个元素

这段代码可以通过VS2013的编译。对于数组的操作无疑有两种,一是获取数组地址,二是操作数组元素,然而获取数组地址的最终目的还是操作数组元素。
〈1〉代码中获取第一元素地址用了5种方法,常用的只有一种cout<<a,第二元素的址就是a+1,第n个元素地址就是a+(n-1)。
〈2〉.如果第一元素的物理地址是0038FC60,那第二元素则是0038FC64,为什么不是0038FC61呢?
因为int类型数据占用4个字节,所以后一元素地址都比前一元素递增4,所以第n个元素物理地址实际是a+(n-1)*sizeof(int),其中sizeof(int)返回int类型数据的字节数。
〈3〉继续研究这段代码,cout<<&a的用法和字符数组是相同的,但是字符数组如果写成这样cout<<ch(假设char ch[10]{})那输出就是整个字符串。使用数组名称时,编译器自动将其隐式转换为指针,存储的地址是数组的首地址。
〈4〉*(&a) 和&(*a)其实就是a,因为间接寻址运算符“*”和取址运算符“&”互为逆运算,相互抵消还原为a。同理*&(*a)和**(&a)也是如此,从右至左运算,最后都*a,表达的都是第一个元素值。访问元素常用的方法还是a[0],第n个元素就是a[n-1]。
采用地址偏移法也能访问数组中的其他元素,如*(a+1)就是第二元素a[1].
〈5〉但是如果用&(a+1)获取第二元素地址就会出错,提示“&”操作的对象必须是左值。那么这里要讨论一下什么是左值和右值。

左值和右值

C++没有严格定义左值和右值,简单来说:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值