指针数组与数组指针

数组指针与指针数组

动态数组

扩容:空间不够,重新申请2倍大小的连续空间,拷贝元素后,释放旧空间

动态数组区别于静态数组,其不具备begin(),end()操作

c++ 复制代码
 //动态一维数组
    int n = 10;
    int *a = new int[n];//可以输入n值,不固定
    for (int i = 0; i < n;i++)
        a[i] = rand() % 100;
    for (int i = 0; i < n;i++)
        cout << a[i] << " ";

由于普通类型int,double没有指向首尾字符的指针,需要借助end(),begin()函数

c++ 复制代码
    int b[10];
    for (int i = 0; i < 10;i++)
        b[i] = rand() % 100;
    //迭代器遍历,只有静态数组有
    for (auto it = begin(b); it != end(b);it++)
        cout << (*it)<< " ";

或者直接使用静态数组名

c++ 复制代码
  int a[5] = {1, 6, 7, 9, 4};
    for(auto v:a)
        cout << v << " ";
初始化
c++ 复制代码
 //动态一维数组
    int n = 5;
    double *p = new double[n]{1.1, 2.2, 3.3, 4.4, 5.5};
    for (int i = 0; i < n;i++)
        cout << p[i] << " ";
    cout << endl;
    //动态字符串
    string *s = new string[n]{"aa", "bb", "cccc", "d", "eee"};
    for (int i = 0; i < n;i++)
        cout << s[i] << " ";

数组指针和指针数组

c++ 复制代码
    int arr[] = {1, 2, 3,4};
    //arr=&arr=&arr[0]
    cout << "  arr:" << arr << endl;
    cout << " &arr:" << &arr << endl;
    cout << "&arr[0]:" << &arr[0] << endl;
    int *pa = &arr[1];//指向数组第2个元素
    //arr = arr + 1;--arr的地址不可以改变
    pa = pa + 1;
    cout << (*pa) << ":"<< pa[1] << endl;//结果是:3,4
数组类型的指针

数组元素的类型 (*指针名)【】=&数组名

c++ 复制代码
int arr[] = {1, 2, 3,4};
    //必须加(),因为[]优先级高于*
    //(*parr)---这是一个指针
    //(*parr)[]---是一个数组类型的指针
    //int (*parr)[]---这个数组里面元素的类型是int
    int(*parr)[] = &arr;
    for (int i = 0; i <4;i++){
        //只需要访问下标改变,不需要指针自己的改变
        cout << (*parr)[i] << " ";
数组指针指向多个元素数组

首先: int (*p)数组元素个数=数组名

ABAP 复制代码
比如:arr[m][n],如果一个(*p)[]指向它,那么[]的大小为n
--
访问时候:P[i][j]等价于*(*(p+i)+j)   注意:*(p+i)
c++ 复制代码
 int aa[3][4] = {
        {1, 2, 3, 4},
        {22, 33, 44, 55},
        {77, 88, 99, 100}};
    int(*p)[4] = aa;//[]内是数组元素的个数,每一行
    for (int i = 0; i < 3;i++){
        for (int j = 0; j < 4;j++){
            cout << *(*(p + i) + j) << " ";
        }
        cout << endl;
    }
     for (int i = 0; i < 3;i++){
        for (int j = 0; j < 4;j++){
            cout <<p[i][j]<< " ";
        }
        cout << endl;
    }
元素是指针的数组

数据类型* 数组名【】

c++ 复制代码
  int a = 100;
    int b = 200;
    int c = 300;
    //arr[]是一个数组
    //int*---arr[]数组每一个元素是指针
    int *arr[] = {&a,&b,&c};
    for (int i = 0; i < 3;i++)
        cout << *arr[i] << " ";

扩展---一个数据类型是数组的指针,而且数组元素是指针类型

  • 首先得存在一个元素类型是指针的数组:int* arr\[\]

  • 然后定义一个类型为数组的指针指向它:int* (*parr)\[\]=&arr;

    c++ 复制代码
    (*parr)[i]=arr[i]=&i
    
    i=*(&i)=*((*parr)[i])
c++ 复制代码
    int a = 11, b = 22, c = 33;
    int *arr[] = {&a, &b, &c};
    //定义一个指向arr的元素类型为数组的指针
    int *(*parr)[] = &arr;
    // 想通过parr访问元素
    //(*parr)[0]=&b;
    //b=*(&b)=*(*parr[0])
    for (int i = 0; i < 3;i++)
        cout << *((*parr)[i]) << " ";

动态二维数组

c++ 复制代码
    int n =4;
    //**arr是指针的指针,然后指向了一个指针数组(数组里的元素全是指针)
    //然后把这个数组里面的每一个指针,动态创建一个一维数组
    int **arr = new int*[n];
    for (int i = 0; i < n;i++)
        arr[i] = new int[n];

定义了一个指向指针数组的双重指针arrayPtr

元素数据类型为 int* 的数组 int*

c++ 复制代码
//赋值和遍历
 for (int i = 0; i < n;i++){
        for (int j = 0; j < n;j++){
            arr[i][j] = rand() % 100;
        }
    }
    for (int i = 0; i < n;i++){
        for (int j = 0; j < n;j++){
            cout<<arr[i][j]<<" ";
        }
        cout << endl;
    }

利用new去创建可输入值的指针数组

int (p)m=new intn m 这里:n就是P的个数

c++ 复制代码
int n = 5;
    int(*p)[4] = new int[n][4]; // 先行后列
    for (int i = 0; i < n; i++)
        for (int j = 0; j < 4; j++)
            p[i][j] = rand() % 100;

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            cout << *(*(p + i) + j) << " ";
        }
        cout << endl;
    }
相关推荐
JieE21211 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
clint4563 天前
C++进阶(1)——前景提要
c++