C++中 int *p[2]与int (*p)[2]区别

区别C++中 int *p[2]与int (*p)[2]区别

转载自 http://blog.csdn.net/ajioy/article/details/6951643

为了简单明了的理解,直接上代码

#include <iostream> 
using namespace std; 

int main() 
{ 
    int *p[4]; //p是一个指针数组,每一个指针都指向一个int型数据 
    int a=1,b=2,c=3,d=4;
    int i;
    p[0]=&a;
    p[1]=&b;
    p[2]=&c;
    p[3]=&d;
    int (*q)[4];//q是一个指针,指向int[4]数组 
    //q[0]=&a;//error   q是指向int[4]数组的指针,而&a是一个int型指针,所以不能赋值 
    int aa[4]={5,6,7,8};
    q=&aa;
    cout << "p的值:" << p << endl; //注意,p不等于p[0] 
    cout << "p[0]的值:" << p[0] << "  a的地址:" << &a << endl;

    cout << "p[0]地址保存的值:" << *(p[0]) << "  a的值:" << a << endl;
    cout << "p[1]地址保存的值:" << *(p[1]) << "  b的值:" << b << endl;
    cout << "p[2]地址保存的值:" << *(p[2]) << "  c的值:" << c << endl;
    cout << "p[3]地址保存的值:" << *(p[3]) << "  d的值:" << d << endl;


    cout << "q的值:" << q << "  aa的地址:" << &aa << endl;

    cout << "q[i]的地址:" << endl;
    for(i = 0; i < 4; ++i)
    cout << q[i] << endl;//q[0] 与 q的值相同 

    cout << "q指向int[4]的所有值:" << endl;
    for(i = 0; i < 4; i++)
    cout << q[0][i] << ' ';
    cout << endl;
    //cout<<*(p[0])<<*(q[0])<<endl;
    return 0; 
} 

输出结果:

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]的存储结构如下:
这里写图片描述

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值