C++基础---指针数组与数组指针

1. 指针数组与数组指针

1.1 指针数组的定义

  • 指针数组:是数组元素为指针的数组,本质为数组
  • 指针数组:每一个元素均为指针,即有诸形如“*ptr_array[i]”的指针。
    注:由于数组元素均为指针,因此ptr_array[i]是指第i+1个元素的指针。
  • 指针数组的定义形式为:类型名 *数组标识符[常量表达式];
    如:int *a[4];//指针数组
    表示:数组a中的元素都为int型指针
    元素表示:* a[i]跟* (a[i])是一样的,因为[]优先级高于*

1.2 指针数组的应用

  • 指针数组:可以作为函数的参量使用,使用方式与普通数组类似。
  • 指针数组:常适用于指向若干字符串,这样使字符串处理更加灵活方便。

    
    #include<iostream>
    
    using namespace std;
    int main()
    {
        char *p[5] = {"h", "e", "l", "l", "o"};
        for(int i=0; i<5; i++)
        {
            cout<<p[i]<<"\t";
        }
        cout<<endl;
        for(int i=4; i>=0; i--)
        {
            int x = i+65;
            p[i] = (char*)(&x);
            cout<<p[i]<<"\t";
        }
        cout<<endl;
        system("pause");
        return 0;
    }
    =>h       e       l       l       o
      E       D       C       B       A

1.3 指针数组与二维数组

  • 二维数组:如char string_1[10][10]只要定义了一个二维数组,无论赋不赋值,系统都会给他分配相应空间,而且该空间一定是连续的。其每个元素表示一个字符。我们可以通过指定下标对其元素进行修改。
  • 指针数组:如char *str_B[5] 系统至少会分配5个连续的空间用来存储5个元素,表示str_B是一个5个元素的数组,每个元素是一个指向字符型数据的一个指针。以下定义: 他们在内存的存储方式分别如下图所示,可见,系统给数组c分配了4×8的空间,而给p分配的空间则取决于具体字符串的长度。此外,系统分配给a的空间是连续的,而给n分配的空间则不一定连续。

    char c[4][8]={"my","name","is","Mini"};//二维数组的定义
    char *p[4]={"my","name","is","Mini"};  //指针数组的定义

    这里写图片描述
    注:由此可见,相比于比二维字符数组,指针数组有明显的优点:一是指针数组中每个元素所指的字符串不必限制在相同的字符长度;二是访问指针数组中的一个元素是用指针间接进行的,效率比下标方式要高。 但是二维字符数组却可以通过下标很方便的修改某一元素的值,而指针数组却无法这么做。

1.4 数组指针的定义

  • 数组指针:指向数组首元素的地址的指针,本质为指针,(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动);
  • 数组指针:存放的是数组首地址的地址,相当于2级指针,这个指针不可移动;
  • 数组指针的定义形式为:类型名 (*数组标识符)[常量表达式];
    如:int (*a)[4];//数组指针
    表示:指向数组a的指针
    元素表示:(*a)[i];

1.5 数组指针的应用

  • 代码示例:

    
    #include<iostream>
    
    using namespace std;
    int main()
    {
        char c[][3] = {"h", "e", "l", "l", "o", "o"};
        char (*p)[3] = c;
        for(int i=0;i<=5;i++)
        {
             cout<<*(p+i)<<"\t";
        }
        cout<<endl;
        for(int i=5; i>=0; i--)
        {
            //(*p)[i] = "X";//编译报错,error C2440: “=”: 无法从“const char [2]”转换为“char”
            cout<<*(p+i)<<"\t";
        }
        cout<<endl;
        system("pause");
        return 0;
    }
    =>h       e       l       l       o       o
      o       o       l       l       e       h

1.6 指针数组与数组指针的程序对比

  • 代码示例:

    
    #include <iostream>
    
    using namespace std; 
    int main()
    {
        int c[4]={1,2,3,4};
        int *a[4];//指针数组
        int (*b)[4];//数组指针
        b=&c;
    
        //将数组c中元素赋给数组a
        for(int i=0;i<4;i++)
        {
            a[i]=&c[i];
        }
    
        cout<<*a[1]<<endl;   //输出2就对
        cout<<(*b)[2]<<endl; //输出3就对
    
        system("pause");
        return 0;
    }
    =>2
      3

    注:定义了数组指针,该指针指向这个数组的首地址,必须给指针指定一个地址,容易犯的错得就是,不给b地址,直接用(*b)[i]=c[i]给数组b中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,但运行时肯定出现问题,使用指针时要注意这个问题。但为什么a就不用给他地址呢,a的元素是指针,实际上for循环内已经给数组a中元素指定地址了。但若在for循环内写*a[i]=c[i],这同样会出问题。
    总之一句话,定义了指针一定要知道指针指向哪里,不然要悲剧。


参考文献:
[1]《C++全方位学习》范磊——第十四章
[2]《C++程序设计教程(第二版)》钱能——第三章
[3]《C++Primer(中文版)》王刚、杨巨峰——第三章
[4] 百度搜索关键字:C++数组、指针数组、数组指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值