数组指针
#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: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,第三层是...。 所以说,数组指针一般用于二维数组比较好
#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 还要注意指针赋值,对于一维数组是int(*p2) = &temp;(看这个也能解释为什么用两层解引用,第一层解引用指向temp,而它是个数组名,储存的也是地址,所以还要一层解引用)
对于二维int(*p2) = temp; 谢谢
页:
[1]