当前位置: 首页 > article >正文

[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数组等考完试有空再出一期有关的文章!祝大家学业顺利!一起进步!


http://www.kler.cn/a/428776.html

相关文章:

  • 点云目标检测训练数据预处理---平面拟合与坐标转换(python实现)
  • 计算机系统原理:一些断言
  • SSE 实践:用 Vue 和 Spring Boot 实现实时数据传输
  • 使用SIPP发起媒体流性能测试详解
  • Nginx:通过upstream进行代理转发
  • AUTOSAR从入门到精通-城市NOA(领航辅助驾驶)
  • 选择 ASP.NET Core Web UI
  • MicroBlaze软核开发(一):Hello World
  • World Labs发布最新3D世界生成模型 | 李飞飞引领AI创新
  • Spring事务的一道面试题
  • React - useContext和深层传递参数
  • AndroidStudio 自定义 lint
  • Redis中pipeline(管道)详解
  • 经验帖 | Matlab安装成功后打不开的解决方法
  • MSSQL靶场(手工注入)通关攻略 第一关
  • 《Java 中 JDBC 连接 MySQL 实现增删改查全攻略》
  • jeccg-boot修改密码
  • tcp_recvmsg 函数
  • 如何在 Redis 上配置 SSL/TLS ?
  • PDF文件打开之后不能打印,怎么解决?
  • Lakehouse 架构下的元数据“大一统”管理深度解析
  • 根据时钟周期来做判断,怎么理清逻辑,计数器的逻辑,握手
  • Docker(一)
  • 【gitLab正常使用记录】
  • 《MySQL 表结构设计基础》
  • 企业数字化转型:从爆品起步,迈向生态平台