C++:指针数组与数组指针

概述

  • 指针数组是一个数组,其中的每个元素都是指针。这些指针可以指向不同的内存地址,通常用于存储一组相同类型的指针。
  • 数组指针是一个指针,它指向数组的首地址。它本身是一个指针,但指向的内容是一个数组对象。
  • 指针数组常用于需要动态管理一组指针的场景,而数组指针则用于处理数组的整体,特别是在函数参数传递和多维数组的处理中比较常见

1. 什么是指针数组 (Array of Pointers)

指针数组是一个数组,其中的每个元素都是一个指针。具体来说,它是一个存储多个指针的数组,数组的每个元素指向一个对象或者数据。

定义:
<type>* arr[size];

其中,<type>* 表示数组元素是指向某种类型的指针,size 是数组的大小。

示例:
#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 20, c = 30;
    
    // 定义一个指针数组,数组中有 3 个 int* 类型的指针
    int* arr[3];
    
    arr[0] = &a;  // arr[0] 指向 a
    arr[1] = &b;  // arr[1] 指向 b
    arr[2] = &c;  // arr[2] 指向 c
    
    // 输出每个指针指向的值
    cout << "*arr[0]: " << *arr[0] << endl;  // 输出 10
    cout << "*arr[1]: " << *arr[1] << endl;  // 输出 20
    cout << "*arr[2]: " << *arr[2] << endl;  // 输出 30
    
    return 0;
}
解释:
  • arr 是一个包含 3 个 int* 的数组,表示 arr 数组的每个元素都是一个指向 int 类型的指针。
  • 每个指针指向不同的 int 类型变量:abc

总结

  • 指针数组是一个数组,其中每个元素都是一个指针。指针数组的每个元素的大小是相同的(指针类型相同),但每个指针可以指向不同的变量或对象。
  • 指针数组 中,每个指针元素的大小是相同的,因为它们是指向相同类型的指针,指针的大小通常是由平台决定的[4 字节(32 位系统)或 8 字节(64 位系统),与指针所指向的类型(int char 或 float)无关]
  • 虽然指针的大小是相同的,但可以使用 void* 来存储不同类型的指针,允许数组存储指向不同类型的指针。

2. 什么是数组指针 (Pointer to Array)

数组指针是一个指针,它指向整个数组。也就是说,它是一个指向数组的指针,而不是指向数组中的单个元素。

定义:
<type> (*ptr)[size];

其中,<type> 是数组中元素的类型,size 是数组的大小。ptr 是一个指针,它指向一个包含 size<type> 元素的数组。

示例:
#include <iostream>
using namespace std;

int main() {
    int arr[3] = {10, 20, 30};
    
    // 定义一个指向数组的指针
    int (*ptr)[3] = &arr;
    
    // 通过指针访问数组元素
    cout << "ptr[0][0]: " << (*ptr)[0] << endl;  // 输出 10
    cout << "ptr[0][1]: " << (*ptr)[1] << endl;  // 输出 20
    cout << "ptr[0][2]: " << (*ptr)[2] << endl;  // 输出 30
    
    return 0;
}
解释:
  • arr 是一个包含 3 个整数的数组。
  • ptr 是一个指向 arr 数组的指针,它可以通过 (*ptr)[index] 来访问数组中的元素。
  • 需要注意,ptr 是指向整个数组的指针,而不是指向数组中的某个元素。

总结

  • 数组指针是一个指针,它指向整个数组。在使用时,指针指向整个数组,可以通过解引用来访问数组的元素。

关键区别

特性指针数组 (Array of Pointers)数组指针 (Pointer to Array)
定义一个数组,数组的每个元素是一个指针一个指针,指向一个数组
元素的类型每个元素是指针,指向某种类型的数据该指针指向整个数组,而不是数组的单个元素
示例int* arr[3]:数组 arr 中有 3 个指向 int 的指针int (*ptr)[3]:指针 ptr 指向一个包含 3 个整数的数组
用法用来存储多个指针,指向不同的对象或数据用来处理指向整个数组的指针,通常用于多维数组

例子对比

指针数组:
int* arr[3];  // 数组的每个元素是一个指针
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;

在这个例子中,arr 是一个指针数组,其中每个元素都是一个指向 int 类型的指针。

数组指针:
int (*ptr)[3];  // ptr 是一个指向包含 3 个整数的数组的指针
ptr = &arr;

在这个例子中,ptr 是一个指向整个数组 arr 的指针,而不是指向数组的单个元素。


总结

  • 指针数组:是一个数组,数组的每个元素是指向某种类型的指针。
  • 数组指针:是一个指针,指向整个数组,而不是数组中的单个元素。

这两者虽然名字相似,但含义和用途完全不同,理解它们的差异对于正确使用指针和数组至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值