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运算符用于数组名时,将返回整个数组占用内存空间的字节数。所以,“数组名就是地址”这句话,不是特别贴切。此外,指针的值可以被修改,但数组名常量,不能修改。

感谢浏览,一起学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值