指针数组与数组指针

数组指针与指针数组

动态数组

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

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

 //动态一维数组
    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()函数

    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)<< " ";

或者直接使用静态数组名

  int a[5] = {1, 6, 7, 9, 4};
    for(auto v:a)
        cout << v << " ";
初始化
 //动态一维数组
    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] << " ";

数组指针和指针数组

    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
数组类型的指针

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

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)[数组元素个数]=数组名

比如:arr[m][n],如果一个(*p)[]指向它,那么[]的大小为n
--
访问时候:P[i][j]等价于*(*(p+i)+j)   注意:*(p+i)
 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 <

指针数组与数组指针_第1张图片

元素是指针的数组

数据类型* 数组名【】

  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;

    (*parr)[i]=arr[i]=&i
    
    i=*(&i)=*((*parr)[i])
    
    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]) << " ";

动态二维数组

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

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

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

//赋值和遍历
 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<

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

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

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;
    }

你可能感兴趣的:(c++知识,算法,c++,数据结构)