【C/C++】int *p[4]与int (*q)[4]的区别

本文深入探讨了C语言中指针与数组的关系及其使用方法,包括不同声明方式下的存储结构和示例代码,并通过具体实例展示了如何正确使用指针与数组进行数据操作。

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

转载自:http://blog.sina.com.cn/s/blog_715de2f50100ojo9.html



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

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

int <wbr>*p[4]与int <wbr>(*q)[4]的区别



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

int <wbr>*p[4]与int <wbr>(*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]的存储数据为:

int <wbr>*p[4]与int <wbr>(*q)[4]的区别

int <wbr>*p[4]与int <wbr>(*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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值