通过指针引用数组元素

通过指针应用数组元素:

(1)下标法,如a[i]形式;

(2)指针法,如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的指针变量,其初值p=a;

例如:有一个整数数组a,有10个元素,要求输出数组中的全部元素。

(1)下标法。

#include<stdio.h>
int main()
{
	int a[10];
	int i;
	printf("please enter 10 integer numbers:");
	for(i = 0; i< 10; i++)
		scanf("%d" ,&a[i]);
	for(i = 0; i<10; i++)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
}

(2)通过数组名计算数组元素地址,找出元素的值。

int main()
{
	int a[10];
	int i;
	printf("please enter 10 integer numbers:");
	for(i=0; i<10; i++)
		scanf("%d",&a[i]);//scanf("%d",a+i);
	for(i=0; i<10; i++)
		printf("%d ",*(a+i));
	printf("\n");
	return 0;
}


(3)用指针变量指向数组元素

#include<stdio.h>
int main()
{
	int a[10];
	int *p,i;
	printf("please enter 10 integer numbers:");
	for(i=0; i<10; i++)//该行可用for(p=a; p<(a+10); p++)代替
		scanf("%d",&a[i]);//该行也可用scanf("%d",p);
	for(p=a; p<(a+10); p++)
		printf("%d ",*p);
	printf("\n");
	return 0;
}

总结:(1)和(2)方法执行效率相同。这两种方法找数组元素费时较多。(3)方法用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的。

用下表法比较直观,能直接知道是第几个元素。使用指针变量是时,要注意指针变量的当前值。
例如:通过指针变量输出整形数组a的10个元素。

#include<stdio.h>
int main()
{
	int i,a[10],*p = a;//p的初值是a,p指向a[0]
	printf("please enter 10 integer number:");
	for(i=0;i<10;i++)
		scanf("%d",p++);
	p = a;//上一个循环中循环完成后p的指针已经指到a[9]地址,而不是以前的p指的a[0]地址,所以要输出的时候必加上p=a语句,不然会输出错误,p=a,使p重新指向a[0]的地址接着进行下一个循环进行输出。
	for(i=0;i<10;i++,p++)//也可这样表示for(i=0; i,10; i++)
		printf("%d",* p);//printf("%d",*p++);
	printf("\n");
	return 0;
}


总结:指向数组的指针变量也可带下标,如p[i]。带下表的指针变量的含义是:等指针变量指向数组元素时,指针变量可以带下标。因为在程序编译时,对下标的处理方法式转换为地址的,对p[i]处理成*(p+i),如果p是指向一个整形数组元素a[0],则p[i]代表a[i]。但是必须清楚p的当前值是什么。



设p指向数组a的首元素(即p=a):

分析;

(1)p++;      *p;

p++使p指向下一元素a[1]。然后若再执行*p,则得到下一个元素a[1]的值;

(2)*p++:

由于++和*同优先级,结合方向自右而左,其等价于*(p++)。先引用p的值,实现*p的运算,然后再使p自增1。

(3)*(p++)与*(++p)

*(p++)先取*p的值,然后再使p加1.

*(++p)先使p加1,再取*p.

若p初值为a(即&a[0]),若输出*(p++),得到a[0]的值,而输出*(++p),得到a[1]的值.

(4)++(*p).表示p所指向的元素值加1,如果p=a,则++(*p)相当于++a[0],若a[0]的值是3,则在执行++(*p)后a[0]的值是4,注意:是元素a[0]的值加1,而不是指针p的值家1.

(5)如果p当前指向a数组中第i个元素a[i],则

*(p--)相当于a[i--],先对p进行“ * ”运算(求p所指向的元素的值),再使p自减。

*(++p)相当于a[++i],先使p自加,在进行“*”运算。

*(--p)相当于a[--i],先使p自减,在进行“*”运算。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值