[C++]C风格数组之指针数组、数组指针、指向数组的指针、指向数组第一个元素的地址的指针的异同和联系
一、指针数组(是数组)
1.定义:
指针数组是一个数组,只不过数组中存放的元素是某种类型的指针(一个指针数组里的指针类型要是一样的)。即数组的每个元素存放的是指向某个数据的内存地址。
2.语法格式:
类型* 数组名[数组大小];
// 数组名 是一个包含数组大小个指针的数组,每个指针指向类型为 '类型' 的变量
例如:
int* arr[5];
// arr 是一个包含 5 个指向int型数据变量的具体地址的指针构成的数组,每个指针指向一个 int 类型的变量
3.代码示例:
int* arr[5]; // arr 是一个包含 5 个指针的数组,每个指针都指向一个 int 类型的变量
int a = 10, b = 20, c = 30;
arr[0] = &a; // arr[0] 指向 a
arr[1] = &b; // arr[1] 指向 b
arr[2] = &c; // arr[2] 指向 c
- 定义:
arr
是一个数组,数组中有 5 个元素,每个元素都是int*
类型的指针。 - 访问:你可以通过
arr[i]
来访问数组中的每个指针,再通过*arr[i]
来访问这些指针所指向的int
类型变量。
二、数组指针(是指针)
1.理解:
- 数组指针 通常是指一个指向数组的指针。换句话说,它指向整个数组,并且它存储的是整个数组的地址。
- 数组指针知道数组的大小,所以它不仅仅是指向数组第一个元素的指针,而是一个指向“数组”的指针,能代表整个数组。
2.语法格式:
类型 (*指针名)[数组大小];
// 指针名 是一个指向数组的指针,指向一个包含 '数组大小' 个 '类型' 元素的数组
例如:
int arr[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &arr; // p 是一个数组指针,指向整个数组 arr
3.代码示例:
int arr[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &arr; // p 是一个数组指针,指向包含 5 个 int 元素的数组
- ptr 是一个指向整个数组的指针,不仅指向
arr[0]
,而是整个数组arr
。你可以通过(*ptr)[0]
访问数组的第一个元素,(*ptr)[1]
访问第二个元素,以此类推。cout << (*p)[0]; // 输出 1,(*p)[0]可以访问数组的第一个元素 cout << (*p)[1]; // 输出 2,(*p)[1]可以访问数组的第二个元素 cout << (*p)[2]; // 输出 3,(*p)[2]可以访问数组的第三个元素 cout << (*p)[3]; // 输出 4,(*p)[3]可以访问数组的第四个元素 cout << (*p)[4]; // 输出 5,(*p)[4]可以访问数组的第五个元素 //cout << (*p)[5];//错误使用 // 输出 0,(*p)[5]访问的是数组的第六个元素,但是数组只有五个元素,所以访问第六个元素会内存溢出
三、指向数组的指针(是数组指针的别名)
- 指向数组的指针 和 数组指针 实际上是同一个概念,都是指向整个数组的指针。它们指向数组的首地址,并且能够提供数组的大小信息,以及通常通过
(*ptr)[索引]
的方式来访问数组元素,因此,这两个术语是可以互换使用的。 -
但是,如果非要区分:
- 数组指针(Array Pointer)可能更侧重于强调“指向数组”这一概念,表示的是一个指针,指向一个数组。
- 指向数组的指针(Pointer to an Array)更强调“指向数组的具体实现方式”,它是一个指针,指向整个数组的地址。
四、指向数组第一个元素的指针(指向数组第一个元素的地址的指针)
1.理解:
指向数组第一个元素的指针 是一个普通的指针,它指向数组的第一个元素。这个指针只知道数组第一个元素的地址,但它不包含数组的大小信息。
2.语法格式:
类型* 指针名 = 数组名;
//类型:数组元素的类型(如 int)。
//指针名:指向数组第一个元素的指针变量名。
//数组名:数组名本身代表数组首元素的地址。
3.代码示例:
#include <iostream>
using namespace std;
int main() {
int arr[5] = {1, 2, 3, 4, 5};
// ptr 是指向数组第一个元素的指针,
int* ptr = arr;
//但是可以直接使用 ptr[0] 和 ptr[1] 来访问数组中的元素。
std::cout << "数组第一个元素:" << ptr[0] << std::endl; // 输出 1
std::cout << "数组第二个元素:" << ptr[1] << std::endl; // 输出 2
return 0;
}
五、综合
1.对比
概念 | 定义 | 语法格式 | 说明 |
---|---|---|---|
指针数组(Array of Pointers) | 是一个数组,数组的每个元素都是一个指针,指向不同的数据(变量)的地址。 | 类型* 数组名[数组大小]; | 数组中的每个元素是一个指向其他数据类型的指针。 |
数组指针(Array Pointer) | 是一个指针,指向整个数组,存储数组的首地址,能够访问整个数组的元素。 | 类型 (*指针名)[数组大小]; | 指向的是数组的整个内容,不只是指向数组的第一个元素。 |
指向数组的指针(Pointer to Array) | 和 数组指针 其实是同一个概念,它是一个指针,指向整个数组,能够访问数组的元素。 | 类型 (*指针名)[数组大小]; | 和 数组指针 完全相同,指向整个数组的首地址。 |
指向数组第一个元素的指针(Pointer to the First Element) | 是一个普通指针,指向数组的第一个元素。 | 类型* 指针名 = 数组名; | 指向数组的第一个元素地址,只知道元素的地址,不知道数组的大小。 |
区别项 | 指针数组 | 数组指针 / 指向数组的指针 | 指向数组第一个元素的指针 |
---|---|---|---|
指向的对象 | 是一个数组,每个元素都是一个指针,指向其他数据。 | 是一个指向整个数组的指针,指向的是整个数组。 | 是一个指向数组第一个元素的指针,只知道第一个元素的地址。 |
语法格式 | 类型* 数组名[数组大小]; | 类型 (*指针名)[数组大小]; | 类型* 指针名 = 数组名; |
访问方式 | 使用 数组名[索引] 访问数组中指针的地址,指针名[索引] 访问指向的数据。 | 使用 (*ptr)[索引] 来访问数组元素。 | 直接使用 ptr[索引] 或 *ptr 来访问数组元素。 |
存储的内容 | 每个元素是一个指针,指向不同的数据(变量、数组等)。 | 存储的是数组的首地址,可以通过 (*ptr)[索引] 来访问数组元素。 | 存储的是数组第一个元素的地址,无法直接知道数组的大小。 |
是否知道数组大小 | 不知道数组大小,指向的是指针数组中的元素。 | 知道数组大小,能够通过指针访问整个数组。 | 不知道数组大小,只能通过指针访问数组的元素。 |
实际应用 | 用于存储多个指向不同数据的指针,如字符串数组等。 | 用于存储指向整个数组的指针,能够通过指针访问整个数组。 | 用于访问数组的第一个元素,通常用在函数中处理数组的情况。 |
2.完整的代码示例:
1.指针数组:
#include <iostream>
int main() {
int a = 10, b = 20, c = 30;
int* ptrArr[3]; // ptrArr 是一个指针数组,包含 3 个指针
ptrArr[0] = &a;
ptrArr[1] = &b;
ptrArr[2] = &c;
std::cout << "*ptrArr[0]: " << *ptrArr[0] << std::endl; // 输出 10
std::cout << "*ptrArr[1]: " << *ptrArr[1] << std::endl; // 输出 20
std::cout << "*ptrArr[2]: " << *ptrArr[2] << std::endl; // 输出 30
return 0;
}
2.数组指针/指向数组的指针:
#include <iostream>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr; // ptr 是一个指向数组的指针,指向整个数组 arr
std::cout << "(*ptr)[0]: " << (*ptr)[0] << std::endl; // 输出 1
std::cout << "(*ptr)[1]: " << (*ptr)[1] << std::endl; // 输出 2
return 0;
}
3.指向第一个元素的指针:
#include <iostream>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr; // ptr 是指向数组第一个元素的指针
std::cout << "ptr[0]: " << ptr[0] << std::endl; // 输出 1
std::cout << "ptr[1]: " << ptr[1] << std::endl; // 输出 2
return 0;
}
3.总结:
- 指针数组 是一个数组,数组的每个元素是一个指针,指向不同的数据。
- 数组指针 / 指向数组的指针 是同一个概念,指向一个完整的数组,并且可以通过指针访问数组中的每个元素。
- 指向数组第一个元素的指针 是一个普通指针,指向数组的第一个元素。
PS:这篇文章讲的是C++里的传统的C风格数组,C++特有的std::arry数组等考完试有空再出一期有关的文章!祝大家学业顺利!一起进步!