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++没有严格定义左值和右值,简单来说: