C++的数组和指针在C/C++中占有非常重要的位置。我们先看一个比较简单的例子
short array[10] = { 1, 2, 4, 8, 6, 9, 7, 36, 89, 45 }; std::cout << array << std::endl; std::cout << array + 1 << std::endl; std::cout << *(array + 1) << std::endl;
输出结果如下
0x006FFAF0 0x006FFAF2 2
我们简单说一下为什么是这个结果
1. array我们都知道代表的数组的首地址, 它与&array[0] 的地址是相同
2. 然后 array + 1, 结果是 0x006FFAF0 + 0x02, 那么为什么结果不是 0x006FFAF0 + 0x01呢, 因为我们在定义array的时候已经定义了它是 short*, 而short是占2个字节的, 所以这就是为什么结果是 0x006FFAF0 + 0x02
3. 这个就更简单了, 就是取出以 0x006FFAF2 为首地址的后面2个字节的数据
我们用下面一张图形来表示这个内存结构
由此我们猜想以 0x006FFAF2 为首的4个字节的内容应该是 0x00 04 00 02 用十进制表示就是 262146, 我们来验证一下
那么怎么获取 0x006FFAF2 为首的4个字节的内容呢, 实际上我们可以利用 *(int*) 0x006FFAF2 或者是 *(int*)(array + 1) 来获取
auto value = *(int*)(array + 1); std::cout << value << std::endl;
我们验证一下结果
我们可以看到结果与我们根据模型得到的结果完全一致。
特殊的数组--字符数组
字符数组我们可以按照普通的数组一样给它赋初始值, 也可以用字符串给它赋值,就像下面一样。
char charArray[] = "Hello"; std::cout << sizeof(charArray) << std::endl;
这个输出结果是
6
知道为什么是6吗, 因为在字符串的结尾有一个默认的终止结束符 '知道为什么是6吗, 因为在字符串的结尾有一个默认的终止结束符 '\0' 也占用了一个字节' 也占用了一个字节
今天的内容主要就是讲了以下数组的内存模型, 最后有个思考题大家一起看下
short (*parray)[10] 和 short (&parray)[10]
分别代表什么意思?