C++中int *p[4]和 int (*q)[4]的区别 (指针数组和数组指针)

int *p[4];  //定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义了。
int (*p)[4]; //定义一个数组指针,该指针指向含4个元素的一维数组(数组中每个元素是int型)。

区分int *p[n]; 和int (*p)[n]; 就要看运算符的优先级了。
int *p[n]; 中,运算符[ ]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组。
int (*p)[n]; 中( )优先级高,首先说明p是一个指针,指向一个整型的一维数组。


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

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

前: 指针数组;是一个元素全为指针的数组.
后: 数组指针;可以直接理解是指针,只是这个指针类型不是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];


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

[cpp]  view plain  copy
  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\n",i,j,*(*(p+i)+j));

       }

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

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

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

           printf("*(*(q+%d)+%d)=%d\n",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

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值