一维数组的存储
#include <stdio.h>
int main()
{
int arr[8];
int i,Num;
for(i=0;i<8;i++)
{
printf("大小为:%d\n",sizeof(int));
printf("&arr[%d]=%p\n",i,&arr[i]);
}
}
大小为:4
&arr[0]=000000000061FDF0
大小为:4
&arr[1]=000000000061FDF4
大小为:4
&arr[2]=000000000061FDF8
大小为:4
&arr[3]=000000000061FDFC
大小为:4
&arr[4]=000000000061FE00
大小为:4
&arr[5]=000000000061FE04
大小为:4
&arr[6]=000000000061FE08
大小为:4
&arr[7]=000000000061FE0C
由上可以看出int占用四个字节,元素arr[i+1]的地址等于arr[i]的地址+sizeof(int)
这说明一维数组中的元素在栈区空间中是顺序存储的。
接下来通过指针访问数组元素:1、指针访问数组地址进行2、通过赋值
方式1:访问数组地址
#include <stdio.h>
int main()
{
int arr[5];
int *p,i;
printf("请输入arr:");
for ( i = 0; i <5; i++)
{
scanf("%d",&arr[i]);
/* code */
}
for(i=0;i<5;i++)
{
p=&arr[i];
printf("p=%d ",*p);
printf("arr[%d]=%d\n",i,arr[i]);
}
}
注意:指针指向的是元素的地址,数组名代表数组在内存的首地址p=arr与p=&arr[0]等价
方式2:通过赋值
#include <stdio.h>
int main()
{
int arr[5]={1,3,5,7,9};
int *p,i;
for(i=0;i<5;i++)
{
p=arr;
printf("p=%d ",*p);
printf("arr=%d ",*arr);
printf("*(p+1)=%d ",*(p+1));
printf("*p+1=%d ",*p+1);
printf("arr[%d]=%d\n",i,arr[i]);
}
}
输出:
可看到*p==arr[0] *(p+1)==arr[1]
p=1 arr=1 *(p+1)=3 *p+1=2 arr[0]=1
p=1 arr=1 *(p+1)=3 *p+1=2 arr[1]=3
p=1 arr=1 *(p+1)=3 *p+1=2 arr[2]=5
p=1 arr=1 *(p+1)=3 *p+1=2 arr[3]=7
p=1 arr=1 *(p+1)=3 *p+1=2 arr[4]=9
区别:*(p+1)与*p+1
*的优先级高于+,*p+1是指针的结果加一;*(p+1)是先将地址后移一个,再解引用,取地址(p+1)的结果,sizeof(*(p+1))=4,所以*(p+1)是先将地址后移一个,数组中的下一个元素。
规律:*(p+1)==arr[1]=>*(arr+1) *p==arr==*(arr+0) 因为相等,所以两边同时去*=> p==arr
arr[0]==*p arr==*p 由上两式=>arr==arr[0]
- *p+i的结果是:*p的值(arr或者arr[0])+ i 的结果;
- arr[i]是通过数组访问元素的结果;
- 是*(p+i)是通过指针p访问元素的结果;
- *(arr+i)是我们通过结果,找出数组与指针之间关系的结果