c语言 指针 1,C语言指针1

一、数组元素的指针

1、数组元素的指针

所谓数组元素的指针就是数组的地址。

用一个指针变量指向一个数组元素:

int a[5]=(1,3,5,7,9);int *p;

p=&a[0];

以上指针变量p指向a数组的第0号元素。

在c语言中,数组名代表数组中首元素的地址,它是一个指针型常量,它的值在程序运算期间是固定不变的。因此,下面两个语句等价:

p=&a[0];

p=a;

2、在引用数组元素时指针的运算

在指针已指向一个数组元素使,可以对指针进行以下运算:

加一个整数(用+或+=),如p+1;

减一个整数(用-或-=),如p-1;

自加运算,如p++,++p;

自减运算,如p--,--p;

两个指针相减,如p1-p2(只有p1和p2都指向同一数组中的元素时才有意义)

两个地址不能相加,如p1+p2是无实际意义的。

注:

(1)如果数组变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。

(2)[ ]实际是变址运算符,即将a[i]按a+i计算地址,然后找出此地址单元中的值。

(3)如果指针变量p1和p2都是指向同一数组中的元素,如执行p2-p1,结果是p2-p1的值(两个地址之差)除以数组元素的元素的长度。

这个结果是有意义的,表示p2所指的元素与p1所指的元素之间差两个元素。即用p2-p1可知道它们所指元素的相对距离。

(4)指针变量可以带下标,对p[i]处理成*(p+i),如果p指向一个整形数组元素a[0],则p[i]代表a[i]。如果p指向一个整形数组元素a[2],则p[i]代表a[2+i]。

3、通过指针引用数组元素

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

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

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

(1)下标法:

(1)下标法

#include

intmain()

{int a[10];inti;

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]);return 0;

}()

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

#include

intmain()

{int a[10];inti;

printf("please enmter 10 integer numbers:");for(i=0;i<10;i++)

scanf("%d",&a[i]);for(i=0;i<10;i++)

printf("%d",*(a+i));//通过数组名和元素序号计算元素地址,在找到该元素return 0;

}

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

#include

intmain()

{int a[10];int i,*p;

printf("please enmter 10 integer numbers:");for(i=0;i<10;i++)

scanf("%d",&a[i]);for(p=a;p

printf("%d",*p);//用指针指向当前的数组元素return 0;

}

分析:

C编译系统是将a[i]转换为*(a+i)处理的,即先计算元素地址。第(1)和第(2)种方法执行效率是相同的,即都是先计算*(a+i),因此用第(1)和第(2)种方法找数组元素费时较多。

而第(3)种方法比第(1)、第(2)种方法快,用指针变量直接指向元素,不必每次都重新计算地址,因为像p++这样的自加操作是比较快的。

这种有规律地改变地址值(p++)能大大提高执行效率。这种方法能使程序简洁、高效。适合有经验的编程者。

但是下标法比较直观,能直接知道是第几个元素。这种方法比较直观、不易出错。适合初学者。

利用指针引用数组元素,比较灵活方便,有不少的技巧,请分析下面几种情况(设p开始时指向数组a的首元素(即p=a)):

(1)、

p++;*p;

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

(2)、

*p++;

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

例:

for(i=0;i<10;i++,p++)

printf("%d",*p);

可以改写成for(i=0;i<10;i++)

printf("%d",*p++);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值