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

来源:互联网 发布:spring源码视频百度云 编辑:程序博客网 时间:2024/05/21 09:37

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++数组、指针数组、数组指针

0 0