C++ —— 一维数组和指针
指针的算术
将指针变量(地址的值)+1
后,增加的量
等于它指向的数据类型的字节数
。示例代码如下:
#include <iostream>
using namespace std;
int main() {
char a; cout << "sizeof(a) = " << sizeof(a) << endl;
short b; cout << "sizeof(b) = " << sizeof(b) << endl;
int c; cout << "sizeof(c) = " << sizeof(c) << endl;
double d; cout << "sizeof(d) = " << sizeof(d) << endl;
cout << "a 的地址是:" << (void*)&a << endl;
// cout有bug,把地址当成字符串显示了
// 所以,(void*)是告诉编译器,这里是指针,不是字符串
cout << "a 的地址+1是:" << (void*)(&a + 1) << endl;
cout << "b 的地址是:" << (void*)&b << endl;
cout << "b 的地址+1是:" << (void*)(&b + 1) << endl;
cout << "c 的地址是:" << (void*)&c << endl;
cout << "c 的地址+1是:" << (void*)(&c + 1) << endl;
cout << "d 的地址是:" << (void*)&d << endl;
cout << "d 的地址+1是:" << (void*)(&d + 1) << endl;
return 0;
}
运行结果如下:
sizeof(a) = 1
sizeof(b) = 2
sizeof© = 4
sizeof(d) = 8
a 的地址是:0x7fffeef73089
a 的地址+1是:0x7fffeef7308a
b 的地址是:0x7fffeef7308a
b 的地址+1是:0x7fffeef7308c
c 的地址是:0x7fffeef7308c
c 的地址+1是:0x7fffeef73090
d 的地址是:0x7fffeef73090
d 的地址+1是:0x7fffeef73098
数组的地址
数组
在内存中占用的空间
是连续
的。- C++将
数组名
解释为数组第0个元素
的地址
。 - 数组
第0个元素
的地址
和数组首地址
的取值是相同的。 - 数组
第n个元素
的地址是:数组首地址 + n
- C++编译器把
数组名[下标]
解释为*(数组首地址 + 下标)
示例代码如下:
#include <iostream>
using namespace std;
int main() {
int a[5] = {324, 578, 789, 134, 567};
// 为了方便计算,把地址转换成长整型
cout << "a的值:" << (long long)a << endl;
cout << "&a的地址:" << (long long)&a << endl;
cout << "a[0]的地址:" << (long long)&a[0] << endl;
cout << "a[1]的地址:" << (long long)&a[1] << endl;
cout << "a[2]的地址:" << (long long)&a[2] << endl;
cout << "a[3]的地址:" << (long long)&a[3] << endl;
cout << "a[4]的地址:" << (long long)&a[4] << endl;
cout << "a[3] = " << a[3] << endl;
int* p = a;
cout << "p的值:" << (long long)p << endl;
cout << "p + 0的值:" << (long long)(p + 0) << endl;
cout << "p + 1的值:" << (long long)(p + 1) << endl;
cout << "p + 2的值:" << (long long)(p + 2) << endl;
cout << "p + 3的值:" << (long long)(p + 3) << endl;
cout << "p + 4的值:" << (long long)(p + 4) << endl;
cout << "*(p + 3) = " << *(p + 3) << endl;
return 0;
}
运行结果如下:
a的值:140735875117440
&a的值:140735875117440
a[0]的地址:140735875117440
a[1]的地址:140735875117444
a[2]的地址:140735875117448
a[3]的地址:140735875117452
a[4]的地址:140735875117456
a[3] = 134
p的值:140735875117440
p + 0的值:140735875117440
p + 1的值:140735875117444
p + 2的值:140735875117448
p + 3的值:140735875117452
p + 4的值:140735875117456
*(p + 3) = 134
数组的本质
数组
是占用连续空间
的一块内存,数组名
被解释为
数组第0个元素的地址
。C++操作这块内存有两种方法:数组解释法
和指针表示法
,它们是等价的。
数组名不一定会被解释为地址
在多数情况下,C++将数组名
解释为数组的第0个元素的地址
,但是,将sizeof
运算符用于数组名时,将返回整个
数组占用内存空间的字节数
。所以,“数组名就是地址”这句话,不是特别贴切。此外,指针的值可以被修改,但数组名
是常量
,不能修改。
感谢浏览,一起学习!