指向数组元素的指针
目录
#include <stdio.h>
#include <stdlib.h>
int main()
{
// 用指针变量指向数组元素
int i,*p,a[3];
printf("请输入三个整数");
for(i=0;i<=2;i++)
{
scanf("%d",&a[i]);
}
for(p=&a[0];p<=(&a[0]+2);p++)
{
printf("%d\n",*p);
}
system("pause");
return 0;
}
以前是这样操作的:
C编译系统是将a[i]转换成*(a+i)处理的,即先计算元素地址。因此用第一种方法找数组元素耗时更短。用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的。这种有规律地改变地址值(p++)能大大提高执行效率。
但是用第二种方法,即下标法比较直观,能直接知道是第几个元素。用地址法或者指针变量的方法很不直观,很难判断当前处理的是哪一个元素。
指向数组的指针
指向数组的指针,指针指向的是数组第一个元素的地址,所以下面第七行代码没有&号。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int a[5]={1,2,3,4,5};
int *p=a;
for(i=0;i<=4;i++)
{
printf("%d\n",a[i]);
}
system("pause");
return 0;
}
数组指针
#include <stdio.h>
#include <stdlib.h>
#include <string.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));
}
system("pause");
return 0;
}
数组指针,指针指向的是整个数组,所以第七行代码 有&号。(p2=&temp)
第十一行代码分析:
p2: &temp 指向整个数组;对数组名取地址:数组首地址;
*p2 数组首元素地址; *p2+i 数组第i个元素地址;
*( *p2+i) 数组第i个元素的值;
作为对比:a[i][j]是一个二维数组
a:二维数组名,指向一维数组a[0],0行起始地址;
*a: 0行 0列元素地址;
a+1: 一行起始地址;
*(a+1): 一行零列元素地址
*(a+1)+2 :一行二列元素地址;
*(*(a+1)+2):一行二列元素的值
由此可见:数组首地址还是二维数组哪一行(该行其实还是一个一维数组)的起始地址。
本质上还是数组的地址,而不是某个元素的地址,只不过它是数组的 (起始/首)地址,对整个数组取地址,得到的并不是数组的值,更不是数组某个元素的值,得到的还是地址,是该数组首元素或者该行首元素的地址。