zoukankan      html  css  js  c++  java
  • C++中,指针数组和数组指针

    这俩兄弟长得实在太像,以至于经常让人混淆。然而细心领会和甄别就会发现它们大有不同。

    前者是指针数组,后者是指向数组的指针。更详细地说。

    前: 指针数组;是一个元素全为指针的数组.
    后: 数组指针;可以直接理解是指针,只是这个指针类型不是int也不是char而是 int [4]类型的数组.(可以结合函数指针一并看看......)

    int*p[4]------p是一个指针数组,每一个指向一个int型的
    int (*q)[4]---------q是一个指针,指向int[4]的数组。

    两者在定义的时候如下:

    int k;
    cin>>k;

    char *p[2];
    p[0]=new char[k];
    p[1]=new char[k];

    char (*b)[2];
    b=new char[k][2];


    这样空说是不是依旧小白?举个例子

    1. #include <iostream>   
    2. using namespace std;   
    3.   
    4. int main()   
    5. {   
    6.     int *p[4]; //p是一个指针数组,每一个指针都指向一个int型数据   
    7.     int a=1,b=2,c=3,d=4;  
    8.     int i;  
    9.     p[0]=&a;  
    10.     p[1]=&b;  
    11.     p[2]=&c;  
    12.     p[3]=&d;  
    13.     int (*q)[4];//q是一个指针,指向int[4]数组   
    14.     //q[0]=&a;//error   q是指向int[4]数组的指针,而&a是一个int型指针,所以不能赋值   
    15.     int aa[4]={5,6,7,8};  
    16.     q=&aa;  
    17.     cout << "p的值:" << p << endl; //注意,p不等于p[0]   
    18.     cout << "p[0]的值:" << p[0] << "  a的地址:" << &a << endl;  
    19.       
    20.     cout << "p[0]地址保存的值:" << *(p[0]) << "  a的值:" << a << endl;  
    21.     cout << "p[1]地址保存的值:" << *(p[1]) << "  b的值:" << b << endl;  
    22.     cout << "p[2]地址保存的值:" << *(p[2]) << "  c的值:" << c << endl;  
    23.     cout << "p[3]地址保存的值:" << *(p[3]) << "  d的值:" << d << endl;  
    24.       
    25.       
    26.     cout << "q的值:" << q << "  aa的地址:" << &aa << endl;  
    27.       
    28.     cout << "q[i]的地址:" << endl;  
    29.     for(i = 0; i < 4; ++i)  
    30.     cout << q[i] << endl;//q[0] 与 q的值相同   
    31.       
    32.     cout << "q指向int[4]的所有值:" << endl;  
    33.     for(i = 0; i < 4; i++)  
    34.     cout << q[0][i] << ' ';  
    35.     cout << endl;  
    36.     //cout<<*(p[0])<<*(q[0])<<endl;  
    37.     return 0;   
    38. }   



     运行结果:

    p的值:0x22ff60
    p[0]的值:0x22ff5c  a的地址:0x22ff5c
    p[0]地址保存的值:1  a的值:1
    p[1]地址保存的值:2  b的值:2
    p[2]地址保存的值:3  c的值:3
    p[3]地址保存的值:4  d的值:4
    q的值:0x22ff30  aa的地址:0x22ff30
    q[i]的地址:
    0x22ff30
    0x22ff40
    0x22ff50
    0x22ff60
    q指向int[4]的所有值:
    5 6 7 8

    以下为网友的解释,可能阐述得更为细致。

    定义涉及两个运算符:“*”(间接引用)、“[]”(下标),“[]”的优先级别大于“*”的优先级别。

      首先看int *p[4],“[]”的优先级别高,所以它首先是个大小为4的数组,即p[4];剩下的“int *”作为补充说明,即说明该数组的每一个元素为指向一个整型类型的指针。int *p[4]的存储结构如下:(存储方格横向排列或竖向排列没区别,只要按内存地址顺序排列就行,此处只是为画图方便)

     



        再看int (*q)[4]。它首先是个指针,即*q,剩下的“int [4]”作为补充说明,即说明指针q指向一个长度为4的数组。int (*q)[4]的存储结构如下:

    请看以下定义:

    int a[2][4]={{2,5,6,8},{22,55,66,88}};

    int c[4]={5,8,9,4};

    int d[3]={23,12,443};

    int *p[4],(*q)[4];

    q=a;

    *p=c;

    *(p+1)=d;

    则int *p[4]和int (*q)[4]的存储数据为:

    验证:

     

     

     

    #include <stdio.h>

    int main(void)

    {

        int a[2][4]={{2,5,6,8},{22,55,66,88}};

        int c[4]={5,8,9,4};

        int d[3]={23,12,443};

        int *p[4],(*q)[4];

        q=a;

        *p=c;

        *(p+1)=d;

        int i,j;

        for(i=0;i<2;i++)

            for(j=0;j<4;j++)

           {

               if((i==1)&&(j==3)) break;

               printf("*(*(p+%d)+%d)=%d ",i,j,*(*(p+i)+j));

           }

        puts("===============");

        for(i=0;i<2;i++)

           for(j=0;j<4;j++)

               printf("*(*(q+%d)+%d)=%d ",i,j,*(*(q+i)+j));

       return 0;

    }

    输出结果为:

    *(*(p+0)+0)=5

    *(*(p+0)+1)=8

    *(*(p+0)+2)=9

    *(*(p+0)+3)=4

    *(*(p+1)+0)=23

    *(*(p+1)+1)=12

    *(*(p+1)+2)=443

    ===============

    *(*(q+0)+0)=2

    *(*(q+0)+1)=5

    *(*(q+0)+2)=6

    *(*(q+0)+3)=8

    *(*(q+1)+0)=22

    *(*(q+1)+1)=55

    *(*(q+1)+2)=66

    *(*(q+1)+3)=88

  • 相关阅读:
    GridView编辑删除取消完整代码
    添加删除组件里没有IIS
    关于网站开发中存在的问题
    网络公司网站源码介绍Version1.0
    IIS 状态代码
    收藏常用的快捷方式
    连接池已经满的解决方案
    Do you choose a experienced employee with highsalary or a inexperienced employee with lowsalary?
    Registered Permanent residence/attitude for sports
    数据缓存依赖
  • 原文地址:https://www.cnblogs.com/xuyinghui/p/4945078.html
Copyright © 2011-2022 走看看