61、一维数组和指针

1)指针的算术

将一个整型变量加1后,其值将增加1。

但是,将指针变量(地址的值)加1后,增加的量等于它指向的数据类型的字节数。

2)数组的地址

a)数组在内存中占用的空间是连续的。

b)C++将数组名解释为数组第0个元素的地址。

c)数组第0个元素的地址和数组首地址的取值是相同的。

d)数组第n个元素的地址是:数组首地址+n

e)C++编译器把   数组名[下标]  解释为  *(数组首地址+下标)

3)数组的本质

数组是占用连续空间的一块内存,数组名被解释为数组第0个元素的地址。C++操作这块内存有两种方法:数组解释法和指针表示法,它们是等价的。

4)数组名不一定会被解释为地址

在多数情况下,C++将数组名解释为数组的第0个元素的地址,但是,将sizeof运算符用于数据名时,将返回整个数组占用内存空间的字节数。

可以修改指针的值,但数组名是常量,不可修改。

示例:

#include <iostream>
using namespace std;

int main() {
    // 定义一个整型数组
    int arr[] = {10, 20, 30, 40, 50};
    
    // 显示数组的大小
    cout << "数组大小: " << sizeof(arr) << " 字节" << endl;

    // 通过数组名获取数组第0个元素的地址
    cout << "数组名作为地址: " << arr << endl;

    // 通过指针访问数组元素
    int* ptr = arr; // 数组名是第0个元素的地址
    cout << "通过指针访问第一个元素: " << *ptr << endl;

    // 指针加1
    ptr++;
    cout << "通过指针访问第二个元素: " << *ptr << endl;

    // 数组的地址操作
    cout << "数组第0个元素的地址: " << &arr[0] << endl;
    cout << "数组第1个元素的地址: " << &arr[1] << endl;
    cout << "通过算术运算得到第1个元素的地址: " << arr + 1 << endl;

    // 使用数组名和指针访问元素
    cout << "第0个元素: " << arr[0] << " 或 " << *arr << endl;
    cout << "第1个元素: " << arr[1] << " 或 " << *(arr + 1) << endl;

    // sizeof用于数组名
    cout << "sizeof(arr)给出整个数组的大小: " << sizeof(arr) << " 字节" << endl;
    cout << "sizeof(ptr)给出指针的大小: " << sizeof(ptr) << " 字节" << endl;

    return 0;
}

代码解析

  • 数组大小: 使用sizeof(arr)可以获取整个数组占用的内存大小,这与数组中元素的数量和每个元素的大小有关。
  • 数组名作为地址: 当用在表达式中时(除了sizeof&运算符),数组名代表数组首元素的地址。因此,输出arr将显示数组第一个元素的内存地址。
  • 通过指针访问数组元素: 将数组名赋给指针ptr,然后通过*ptr访问第一个元素,ptr++后,*ptr访问第二个元素。
  • 数组的地址操作: 数组的每个元素都可以通过&arr[index]获得其地址。arr + n计算第n个元素的地址,而不是字面上的加n
  • 使用数组名和指针访问元素: arr[1]*(arr + 1)等价,都访问数组的第二个元素。
  • sizeof用于数组名和指针: sizeof(arr)返回整个数组的大小(字节),而sizeof(ptr)返回指针本身的大小,通常是4或8字节,具体取决于使用的是32位还是64位的系统。

通过这个示例,可以看到指针和数组在C++中的紧密联系以及它们之间操作的等价性,同时也展示了数组名和指针在sizeof表达式中的不同行为。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值