(1)当定义一个指针数据之后 int *p ,通过*p 获取指针指向的数据。
(2)当指针指向一个数组的时候,int *p , int a[3] , p=a ; 因为数组名就是指向数组第一个数值的地址。如下
int main()
{
int *p=NULL;
int a[3]={0,1,2};
p=a;
printf("a[1] is %d\n",a[1]);
printf("p[1] is %d\n",p[1]);
printf("*(p+1) is %d\n",*(p+1));
printf("*(a+1) is %d\n",*(a+1));
return 0;
}
/*输出结果
a[1]=1
p[1]=1
*(p+1)=1
*(a+1)=1
*/
实际上系统在编译时,数组元素 a[i] 就是按 *(a+i) 处理的。即首先通过数组名 a 找到数组的首地址,然后首地址再加上i就是元素 a[i] 的地址,然后通过该地址找到该单元中的内容。
所以 a[i] 写成 *(a+i) 的形式,程序的执行效率会更高、速度会更快。因为在执行程序的时候数组是先计算地址,然后转化成指针。而直接写成指针 *(a+i) 的形式就省去了这些重复计算地址的步骤。
(3)当指针指向一个地址的时候,可以通过p[1]这种下标来访问地址存放的数值。
#include<stdio.h>
int main()
{
int *p=NULL;
p=malloc(80);
p[0]=1;
p[1]=2;
*(p+1)=3;
printf("p[0]= %d \n",p[0]);
printf("p[1]= %d",p[1]);
free(p);
}
/*
p[0]=1;
p[1]=3;
*/