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

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

#include<stdio.h>
int main()
{
int a[10];
int i;
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<stdio.h>
int main()
{
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<(a+10);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++);

 

posted @ 2019-03-31 11:33  Treecity  阅读(301)  评论(0)    收藏  举报