• 数组指针和指针数组


    很多人以为“指向数组的指针”就是“指向指针的指针”,于是有人写这样的代码:
    int a[3][4];
    int **p = a;//错误
      这个代码的错误之处在于a是一个数组,它的成员也是数组,所以a叫做“数组的数组”——C++中严格说来没有二维数组。那么,你要用一个指针来记录a,就要用一个能表示“数组的数组”的指针,以下代码是正确的:
    int (*p)[4] = a;//正确
      只有这样才能保证++p使p指向a的下一对像(该对像是一个数组)。
      顺便提一句:不要写成“int *p[4];”
    来看一下指针数组的指针怎么用,既然都是指针也应该支持动态内存分配,下面的例子展示了如何对数组的指针动态分配内存:
    #include <stdio.h>
    int main()
    {
        int array[3][5]={{1,2,2,4,4},{2,6,5,3,2},{3,5,7,3,5}};
        int (*pa)[5]=array;
        int *pb[3];
        int i=0;
         int (*pp)[5];
         pp = (int (*)[5]) malloc(sizeof(int) * 3);//注:需要这样对指向数组的指针分配空间
         pp = array;
        *pb=*pa;
        *(pb+1)=*(array+1);
        pb[2]=pa[2];
        for(;i<3;++i){
            int j=0;
            for(;j<5;++j)
            printf("%d",pb[i][j]);
            printf(" ");
         }
         printf("\npp pointer point to an array: \n");
         for(i = 0; i < 5; i++)
              printf("%d ",(*pp)[i]);
         printf("\n");
        return 0;
    }

    运行结果:

    C++ 使用new 可以这样写:

    #include <iostream>
    using namespace std;
    
    int main()
    {
         int (*p)[3];
         int pp[2][3] = {1,2,3,4,5,6};
    //     p = new int ((*)[])[3];
         p = (int (*)[3])new int [3];
         p = pp;
         for(int i =0; i < 3; i++)
              cout<<(*p)[i]<<" ";
         cout<<endl;
         p = pp + 1;
         for(int i =0; i < 3; i++)
              cout<<(*p)[i]<<" ";
    
         cout<<endl;
         return 0;
    }

    运行结果:


    下面使用一个函数指针数组来展示一下指针数组的用法:

    #include <iostream>
    using namespace std;
    typedef void (*F)();
    void func_1()
    {
        cout<< "func_1"<<endl;
    }
    void func_2()
    {
        cout << "func_2"<<endl;
    }
    int main()
    {
    
        F *p = (F *) new int [4];
        p[0] = func_1;
        p[1] = func_2;
        p[0]();
        p[1]();
    
        return 0;
    }


    注:这里指针数组主要是想说一下,函数指针数组如何动态分配。

  • 相关阅读:
    Minecraft 1.12.2/1.14.4 Mod开发笔记——搭建环境
    Minecraft 1.12.2 Mod开发笔记
    浅谈莫比乌斯反演
    卡迈克尔数
    一些可能会有用的东西(持续更新)
    emacs配置
    CSPS 2020游记
    浅谈KMP
    Atcoder AGC052
    乌班图操作指令(持续更新)
  • 原文地址:https://www.cnblogs.com/zhuyp1015/p/2615986.html
Copyright © 2020-2023  润新知