呼噜呼噜毛 发表于 2021-2-14 17:16:13

数组指针

#include<stdio.h>
int main()
{
    int temp = {1, 2, 3, 4, 5};
    int(*p2) = &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 = {1, 2, 3, 4, 5};
    int(*p2) = &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,第三层是...。

一叶枫残 发表于 2021-2-14 18:13:13

所以说,数组指针一般用于二维数组比较好
#include<stdio.h>
int main()
{
    int temp;
    int(*p2) = temp;
    int i;
    for(i = 0; i < 3 ; i++)
    {
            printf("*p2+i储存的地址:%d\n",p2+i);
            printf("temp的地址:%d\n\n",&temp);
    }
    return 0;
}
*p2+i储存的地址:6487504
temp的地址:6487504

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

*p2+i储存的地址:6487544
temp的地址:6487544

一叶枫残 发表于 2021-2-14 18:16:59

还要注意指针赋值,对于一维数组是int(*p2) = &temp;(看这个也能解释为什么用两层解引用,第一层解引用指向temp,而它是个数组名,储存的也是地址,所以还要一层解引用)
对于二维int(*p2) = temp;

呼噜呼噜毛 发表于 2021-2-14 21:43:42

谢谢
页: [1]
查看完整版本: 数组指针