C++ -- 数组 vs 指针

本文详细介绍了C++中的数组与指针的区别,包括数组到指针的自动转换、函数参数传递、sizeof运算符的应用以及二维数组与二维指针的差异。通过实例解析了在不同场景下,数组和指针的行为和类型转换规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在很多C++的入门书籍里,在介绍数组的时候,都会提到,数组名可以看成一个常量指针。这句话本身问题并不大,但是由于没有对指针与数组区别的深入解释,会使一些人不能正确了解数组与指针的联系与不同。这里对数组与指针的不同做一点简单的介绍。

什么是数组,什么是指针

首先要明确的是,数组与指针的概念。数组和指针是C++中的两种不同的数据类型。数组指的是在一片连续的内存空间中存储的N个相同类型的对象(object,C++标准中,内存中任何数据都可以被称做object,比如整数,类),而指针则是一个对象的地址。

array-to-pointer conversion

从 数组与指针的概念来看,他们应该是很不相同的,但为什么数组名可以看成一个常量指针呢,这要是因为在C++中,数组不能做为绝大多数操作符 (operator)的操作对象。当数组类型的变量出现在表达式中时,它几乎总是被通过自动类型转换转换指针类型(array-to-pointer conversion),这个指针指向数组的第一个成员。由于这个指针是由自动类型转换生成的,是一个临时变量,因而不能被赋值,这使它表现得像一个常 量。于是,“数组名可以看成一个常量指针”。

事实上,只要数组变量被求值,它就一定会转换成指针。这使得大多数情况下数组可以直接被当成一个指针使用。同时,这种转换也会发生在一些“意想不到”的情况下。

函数的参数

C++的参数是按值传递的,当数组出现在函数参数的位置时,就需要对它求值,从而使它被转换成一个指针。这就决定了,数组不能成为函数的参数。

但是我们知道,函数的定义中是可以出现数组形式的参数的。C++标准规定,在函数定义中出现的数组形式的参数,其类型会被自动地变换为指针类型。从而,函数不会有数组类型的参数,数组形式的参数的类型都被变换为相应的指针类型。由于数组与指针的表现在大多数情况下是相同的,这一般不会带来什么问题。但是,在数组与指针表现不同的时候,就需要注意了。

int func(
    int *a,    // a 是一个指针
    int b[],   // b 是一个指针
### C++数组指针指针数组的概念及用法 #### 数组指针 数组指针是一种特殊的指针,它指向整个数组而不是单个元素。它的定义形式通常为 `(类型 (*指针名)[数组长度])`。这意味着该指针存储了一个数组的首地址,并能够通过解引用访问整个数组。 以下是数组指针的一个简单示例: ```cpp #include <iostream> using namespace std; int main() { int arr[3] = {1, 2, 3}; int (*p)[3]; // 定义一个指向包含3个整数的数组指针 p = &arr; // 将指针指向数组arr cout << "Array elements via pointer to array:" << endl; for (int i = 0; i < 3; ++i) { cout << "Element " << i << ": " << (*p)[i] << endl; // 解引用并访问数组元素 } return 0; } ``` 上述代码展示了如何使用数组指针来操作一维数组[^1]。 --- #### 指针数组 指针数组是一个普通的数组,其中每个元素都是一个指针。它可以用于存储多个不同对象的地址,从而实现灵活的数据管理。其定义方式类似于普通数组,只是每个元素被声明为指针类型。 下面是一个简单的指针数组的例子: ```cpp #include <iostream> using namespace std; int main() { int a = 10, b = 20, c = 30; int* ptrArr[3]; // 定义一个包含三个指针数组 ptrArr[0] = &a; // 存储变量a的地址到第一个位置 ptrArr[1] = &b; // 存储变量b的地址到第二个位置 ptrArr[2] = &c; // 存储变量c的地址到第三个位置 cout << "Pointer Array values:" << endl; for (int i = 0; i < 3; ++i) { cout << *(ptrArr[i]) << endl; // 访问并通过指针获取对应的值 } return 0; } ``` 此代码片段说明了如何创建和初始化一个指针数组以及如何遍历它以访问所指向的对象[^4]。 --- #### 主要区别总结 | 特性 | **数组指针** | **指针数组** | |---------------------|--------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| | 数据结构 | 单个指针,指向整个数组 | 多个指针组成的数组 | | 定义语法 | `类型 (*指针名)[数组长度]` | `类型* 数组名[数组大小]` | | 功能特点 | 可以用来表示多维数组或传递整个数组作为函数参数 | 能够动态分配资源或将不同的数据项链接在一起 | --- #### 使用场景分析 - 当需要处理固定大小的一维或多维数组时,可以选择使用数组指针[^3]。 - 如果程序设计涉及大量独立但关联的数据集合,则更适合采用指针数组的方式进行管理和操作[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值