指针数组与数组指针

数组指针与指针数组

动态数组

扩容:空间不够,重新申请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 int[n] [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;
    }
相关推荐
唐诺3 小时前
几种广泛使用的 C++ 编译器
c++·编译器
XH华4 小时前
初识C语言之二维数组(下)
c语言·算法
南宫生4 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
不想当程序猿_4 小时前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
落魄君子4 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
冷眼看人间恩怨4 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
菜鸡中的奋斗鸡→挣扎鸡4 小时前
滑动窗口 + 算法复习
数据结构·算法
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin5 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码5 小时前
Cmd命令大全(万字详细版)
python·算法·小程序