指针数组与数组指针傻傻分不清

定义
定义
定义
数组指针
指针数组
int (*ptr)[10];
int *ptr[10];
通俗含义
指向
包含
一个数组
数组指针
多个指针
指针数组
内存布局
布局
布局
数组指针内存
指针数组内存
连续内存
大小:10 * sizeof(int)
分散内存
大小:10 * sizeof(int*)
访问
方式
方式
数组指针访问
指针数组访问
ptr[0] 访问第一个数组
ptr[0] 访问第一个指针
*(ptr[0]) 访问指针指向的值

指针数组

指针数组是一种特殊的数组,其中的每个元素都是一个指针。这种数组的主要用途是存储多个指针,这些指针可以指向不同的数据类型,比如整数、字符、结构体等。

特点

  1. 指针数组的每个元素都是指针
  2. 可以存储不同类型的指针。

示例

#include <iostream>

int main() {
    int a = 10;
    int b = 20;
    int c = 30;

    // 创建一个指针数组,存储指向整数的指针
    int* ptrArray[3];

    // 将指针数组的每个元素初始化为指向整数的指针
    ptrArray[0] = &a;
    ptrArray[1] = &b;
    ptrArray[2] = &c;

    // 通过指针数组访问并打印这些整数
    for (int i = 0; i < 3; i++) {
        std::cout << "Element at index " << i << ": " << *(ptrArray[i]) << std::endl;
    }

    return 0;
}

在这个例子中,ptrArray是一个指针数组,每个元素都是一个指向int的指针。我们通过&操作符获取变量abc的地址,并将其存储在指针数组中。然后通过指针数组访问这些变量的值。

数组指针

数组指针是一个指向数组的指针。它是一个指针变量,指向一个数组的首元素。

特点

  1. 数组指针是一个指针,指向一个数组。
  2. 可以是指向一维数组、二维数组等的指针。

示例

#include <iostream>

int main() {
    int arr[3] = {10, 20, 30};
    int (*arrPtr)[3] = &arr; // 指向数组的指针

    // 通过数组指针访问数组元素
    for (int i = 0; i < 3; i++) {
        std::cout << "Element at index " << i << ": " << (*arrPtr)[i] << std::endl;
    }

    return 0;
}

在这个例子中,arrPtr是一个数组指针,它指向一个整数数组arr。我们通过&操作符获取数组arr的地址,并将其存储在数组指针arrPtr中。然后通过数组指针访问数组的元素。

总结

  • 指针数组:一个数组,每个元素都是指针。
  • 数组指针一个指针,指向一个数组。

下面来看一个指针数组的应用场景:

指针数组用于动态分配内存

在C++中,使用指针数组来动态分配内存是一种常见的做法,尤其是在需要存储大量数据或者需要动态扩展数据存储时。

步骤

  1. 定义指针数组:首先定义一个指针数组,用于存储指向动态分配内存的指针。
  2. 分配内存:使用new操作符为每个指针分配内存。
  3. 初始化数据:可以选择初始化分配的内存中的数据。
  4. 使用数据:通过指针数组访问和操作分配的内存。
  5. 释放内存:使用delete操作符释放分配的内存,避免内存泄漏。

示例

假设我们需要动态分配整数数组,并使用指针数组来管理这些数组。

#include <iostream>

int main() {
    const int numArrays = 5;  // 需要创建的数组数量
    const int arraySize = 10; // 每个数组的大小

    // 定义一个指针数组,每个元素指向一个整数数组
    int** ptrArray = new int*[numArrays];

    // 为每个指针分配内存
    for (int i = 0; i < numArrays; i++) {
        ptrArray[i] = new int[arraySize];
    }

    // 初始化数据
    for (int i = 0; i < numArrays; i++) {
        for (int j = 0; j < arraySize; j++) {
            ptrArray[i][j] = i * arraySize + j;
        }
    }

    // 输出数据
    for (int i = 0; i < numArrays; i++) {
        for (int j = 0; j < arraySize; j++) {
            std::cout << "ptrArray[" << i << "][" << j << "]: " << ptrArray[i][j] << " ";
        }
        std::cout << std::endl;
    }

    // 释放内存
    for (int i = 0; i < numArrays; i++) {
        delete[] ptrArray[i]; // 删除数组
    }
    delete[] ptrArray; // 删除指针数组

    return 0;
}
  1. 定义指针数组int** ptrArray = new int*[numArrays]; 创建了一个指针数组,每个元素都是一个指向整数数组的指针。
  2. 分配内存:通过new int[arraySize]为每个指针分配一个整数数组的内存。
  3. 初始化数据:通过两层循环初始化每个数组的元素。
  4. 使用数据:通过指针数组访问和操作每个数组的元素。
  5. 释放内存:先释放每个数组的内存,然后释放指针数组的内存。

这种方法特别适用于需要动态管理多个数组的情况,例如在处理复杂的数据结构或算法时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值