鱼C论坛

 找回密码
 立即注册
查看: 1163|回复: 4

[已解决]数组指针

[复制链接]
发表于 2021-2-14 17:16:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
int main()
{
    int temp[5] = {1, 2, 3, 4, 5};
    int  (*p2)[5] = &temp;
    int i;
    for(i = 0; i < 5 ; i++)
    {
        printf("%d\n", *(*p2 + i));
    }
    return 0;
}
为什么打印那里是*(*p2 + i),而不是*(p2 + i),.
最佳答案
2021-2-14 18:06:02
本帖最后由 一叶枫残 于 2021-2-14 18:08 编辑

一般这样想,数组指针,肯定是先指针再数组,它首先是一个指针,指向一个数组,而数组名代表的就是一个地址,所以要两层解引用
看下面程序,我用十进制输出地址比较好观察
#include<stdio.h>
int main()
{
    int temp[5] = {1, 2, 3, 4, 5};
    int  (*p2)[5] = &temp;
    int i;
    for(i = 0; i < 5 ; i++)
    {
            printf("p2+i储存的地址:%d\n",p2+i);
            printf("*p2+i储存的地址:%d\n\n",*p2+i);
    }
    return 0;
}
p2+i储存的地址:6487536
*p2+i储存的地址:6487536                //相当于*(p2+0)+i 即 p2+i

p2+i储存的地址:6487556
*p2+i储存的地址:6487540                //相当于*(p2+1)+i

p2+i储存的地址:6487576
*p2+i储存的地址:6487544                //相当于*(p2+2)+i

p2+i储存的地址:6487596
*p2+i储存的地址:6487548                //相当于*(p2+3)+i

p2+i储存的地址:6487616
*p2+i储存的地址:6487552                //相当于*(p2+4)+i
对于p2+i,因为定义的是一个指向5个元素的数组,而整型字节大小为4,所以,5个元素就是4*5=20,于是p2+i相当于(p2储存的值)+20*i;
对于*p2+i,相当于*(p2+0)+i,因为进行一次解引用,进入了数组名储存的地址值,而对于整型数组,每个字节大小为4,于是*p2+i相当于(最开始那层数组的首地址)+4*i,同理,第二层则是*(p2+1)+i,第三层是...。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-14 18:06:02 | 显示全部楼层    本楼为最佳答案   
本帖最后由 一叶枫残 于 2021-2-14 18:08 编辑

一般这样想,数组指针,肯定是先指针再数组,它首先是一个指针,指向一个数组,而数组名代表的就是一个地址,所以要两层解引用
看下面程序,我用十进制输出地址比较好观察
#include<stdio.h>
int main()
{
    int temp[5] = {1, 2, 3, 4, 5};
    int  (*p2)[5] = &temp;
    int i;
    for(i = 0; i < 5 ; i++)
    {
            printf("p2+i储存的地址:%d\n",p2+i);
            printf("*p2+i储存的地址:%d\n\n",*p2+i);
    }
    return 0;
}
p2+i储存的地址:6487536
*p2+i储存的地址:6487536                //相当于*(p2+0)+i 即 p2+i

p2+i储存的地址:6487556
*p2+i储存的地址:6487540                //相当于*(p2+1)+i

p2+i储存的地址:6487576
*p2+i储存的地址:6487544                //相当于*(p2+2)+i

p2+i储存的地址:6487596
*p2+i储存的地址:6487548                //相当于*(p2+3)+i

p2+i储存的地址:6487616
*p2+i储存的地址:6487552                //相当于*(p2+4)+i
对于p2+i,因为定义的是一个指向5个元素的数组,而整型字节大小为4,所以,5个元素就是4*5=20,于是p2+i相当于(p2储存的值)+20*i;
对于*p2+i,相当于*(p2+0)+i,因为进行一次解引用,进入了数组名储存的地址值,而对于整型数组,每个字节大小为4,于是*p2+i相当于(最开始那层数组的首地址)+4*i,同理,第二层则是*(p2+1)+i,第三层是...。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-14 18:13:13 | 显示全部楼层
所以说,数组指针一般用于二维数组比较好
#include<stdio.h>
int main()
{
    int temp[3][5];
    int  (*p2)[5] = temp;
    int i;
    for(i = 0; i < 3 ; i++)
    {
            printf("*p2+i储存的地址:%d\n",p2+i);
            printf("temp[i][0]的地址:%d\n\n",&temp[i][0]);
    }
    return 0;
}
*p2+i储存的地址:6487504
temp[i][0]的地址:6487504

*p2+i储存的地址:6487524
temp[i][0]的地址:6487524

*p2+i储存的地址:6487544
temp[i][0]的地址:6487544
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-14 18:16:59 | 显示全部楼层
还要注意指针赋值,对于一维数组是int  (*p2)[5] = &temp;(看这个也能解释为什么用两层解引用,第一层解引用指向temp,而它是个数组名,储存的也是地址,所以还要一层解引用)
对于二维int  (*p2)[5] = temp;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-14 21:43:42 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 15:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表