int *p[4] 与 int (*q)[4] 区别

本文详细解析了C++中指针数组和指针的基本概念及用法,通过实例展示了如何使用指针数组和指针进行数据操作,并提供了代码示例以加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int *p[4] p是一个指针数组, 每一个数组元素指向一个int型数据.

int (*q)[4] q是一个指针, 指向一个int[4]的数组.

int main()
{
    int *p[4];
    int a = 1, b = 2, c = 3, d = 4, e = 5;
    p[0] = &a;
    p[1] = &b;
    p[2] = &c;
    p[3] = &d;
    p[4] = &e;
    //*p = &a;
    //*(p+1) = &b;
    //*(p+2) = &c;
    //*(p+3) = &d;
    //*(p+4) = &e;

    cout << "   p value:" << p      << " &p[0] value:" << &p[0] << endl;
    cout << " p+1 value:" << p + 1  << " &p[1] value:" << &p[1] << endl;

    cout << "p[0] value:" << p[0]   << "     a value:" << &a   << endl;
    cout << "p[1] value:" << p[1]   << "     a value:" << &b   << endl;

    cout << "p[0] value:" << p[0] << *(p[0]) << "  a value:" << a << endl;
    cout << "p[1] value:" << p[1] << *(p[1]) << "  b value:" << b << endl;
    cout << "p[2] value:" << p[2] << *(p[2]) << "  c value:" << c << endl;
    cout << "p[3] value:" << p[3] << *(p[3]) << "  d value:" << d << endl;
    cout << "p[4] value:" << p[4] << *(p[4]) << "  e value:" << e << endl;
}
Result:
   p value:0x7fff53e13c20 &p[0] value:0x7fff53e13c20
 p+1 value:0x7fff53e13c28 &p[1] value:0x7fff53e13c28
p[0] value:0x7fff53e13b78     a value:0x7fff53e13b78
p[1] value:0x7fff53e13b74     b value:0x7fff53e13b74
p[0] value:0x7fff53e13b781  a value:1
p[1] value:0x7fff53e13b742  b value:2
p[2] value:0x7fff53e13b703  c value:3
p[3] value:0x7fff53e13b6c4  d value:4
p[4] value:0x7fff53e13b685  e value:5
int main()
{
    //q是一个指针,指向int[4]数组
    int (*q)[4];
    int a[4] = {5, 6, 7, 8};
    int *p1;
    int *p2;

    q = &a;
    p1 = a;
    p2 = q[0];

    cout <<"  p1 value:"  <<p1     <<"  sizeof(p1):" <<sizeof(p1)  <<endl;
    cout <<"  p2 value:"  <<p2     <<"  sizeof(p2):" <<sizeof(p2)  <<endl;
    cout <<"   a value:"  <<a      <<"   sizeof(a):" <<sizeof(a)   <<endl;
    cout <<"   q value:"  <<q      <<"   sizeof(q):" <<sizeof(q)   <<endl;
    cout <<"  &a value:"  <<&a     <<endl;
    cout <<"a[0] value:"  <<&a[0]  <<endl;
    cout <<"a[1] value:"  <<&a[1]  <<endl;
    cout <<"a[2] value:"  <<&a[2]  <<endl;
    cout <<"a[3] value:"  <<&a[3]  <<endl<<endl;

    cout << "q[i]:" << endl;
    for(int i = 0; i < 4; ++i){
        cout <<i <<" " <<" " <<q[i] <<" " <<q+i << endl;
    }

    cout << "q[i] value:" << endl;
    for(int i = 0; i < 4; i++) {
        cout << q[0][i] <<(*q)[i] <<p1[i] <<p2[i] <<" ";
    }
    cout << endl;
}
Result:
  p1 value:0x7fff574bbc30  sizeof(p1):8
  p2 value:0x7fff574bbc30  sizeof(p2):8
   a value:0x7fff574bbc30   sizeof(a):16
   q value:0x7fff574bbc30   sizeof(q):8
  &a value:0x7fff574bbc30
a[0] value:0x7fff574bbc30
a[1] value:0x7fff574bbc34
a[2] value:0x7fff574bbc38
a[3] value:0x7fff574bbc3c

q[i]:
0  0x7fff574bbc30 0x7fff574bbc30
1  0x7fff574bbc40 0x7fff574bbc40
2  0x7fff574bbc50 0x7fff574bbc50
3  0x7fff574bbc60 0x7fff574bbc60
q[i] value:
5555 6666 7777 8888 

以下为转载

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

1. 详解

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

int (*q)[4], 它首先是个指针,即*q,剩下的int [4]作为补充说明,即说明指针q指向一个长度为4的数组。int (*q)[4]的存储结构如下:
这里写图片描述

2. 实例:
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]的存储数据为:
这里写图片描述
这里写图片描述

3. 实例代码
int main()
{
    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));
        }
    }

    puts("***************************");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值