C++指针详解:轻松掌握指针应用

发表时间: 2021-09-24 23:15

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]

分别代表什么意思?