通过指针引用数组元素C:|WINDOWS)system32)cmd.exe口Xintegernumbers:012345678936780(例8.6】有一个整型数组a,有10个元素,要求输出数组中的全部元素按任意健继续V①下标法②通过数组名计算数组元素地址,找出元素的值③用指针变量指向数组元素#include<stdio.h>#include<stdio.h>#include<stdio.h>int main()int main()int main()int a[10]int a[10]:int a[10]int i:int i;int *p.i;printf(please enter10 integernumbers:);printf(please enter10 integernumbers:")printf(pleaseenter10 integernumbers:")for(i=0;i<10;i++)for(i=0;i<10;i++)for(i=0:i<10;i+ +)scanf("%d",&a[])scanf("%d",&a[])scanf("%d",&a[]):for(i=0:i<10:i++)for(i=0;i<10;i++)for(p=a:p<(a+10)p++)printf("%d",a[]):printf("%d",*(a+i))printf("%d"*p)://数组元素用数组名和下标表示//通过数组名和元素序号计算元素地址找到该元素//用指针指向当前的数组元素printf("%\n"):printf("\n"):printf("/n"):return O:retum o;retum 0;1第(1)和第(2)种方法执行效率是相同的。C编译系统是将a转换为+(a+i)处理的,即先计算元素地址。因此用第(1)和第(2)种方法找数组元素费时较多。第(3)种方法比第(1)、第(2)种方法快,用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的。这种有规律地改变地址值(p++)能大大提高执行效率
通过指针引用数组元素 【例8.6】有一个整型数组a,有10个元素,要求输出数组中的全部元素。 #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; } ①下标法 #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; } ②通过数组名计算数组元素地址,找出元素的值 #include <stdio.h> int main() { int a[10]; int *p,i; printf("please enter 10 integer numbers:"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(p=a;p<(a+10);p++) printf("%d ",*p); //用指针指向当前的数组元素 printf("\n"); return 0; } ③用指针变量指向数组元素 第(1)和第(2)种方法执行效率是相同的。C编译系统是将a[i]转换为*(a+i)处理的,即先计算元素地址。因此用第(1)和第(2)种方法找数组元 素费时较多。 第(3)种方法比第(1)、第(2)种方法快,用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的。这种 有规律地改变地址值(p++)能大大提高执行效率
通过指针引用数组元素用下标法比较直观,能直接知道是第几个元素。适合初学者使用。用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。单用指针变量的方法进行控制,可使程序简洁、高效。注意在使用指针变量指向数组元素时,有以下几个问题要注意(1)可以通过改变指针变量的值指向不同的元素。如果不用p变化的方法而用数组名a变化的方法(例如,用a++)行不行呢?for(p=a;a<(p+10):a++)printf("%d",*a):因为数组名a代表数组首元素的地址,它是一个指针型常量,它的值在程序运行期间是固定不变的。既然a是常量,所以a++是无法实现的。(2)要注意指针变量的当前值
通过指针引用数组元素 用下标法比较直观,能直接知道是第几个元素。适合初学者使用。 用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。单用指针变量的方法进行控制,可使 程序简洁、高效。 注意 • 在使用指针变量指向数组元素时,有以下几个问题要注意: (1) 可以通过改变指针变量的值指向不同的元素。 如果不用p变化的方法而用数组名a变化的方法(例如,用a++)行不行呢? 因为数组名a代表数组首元素的地址,它是一个指针型常量,它的值在程序运行期间是固定不变的。既然a是常 量,所以a++是无法实现的。 (2) 要注意指针变量的当前值。 for(p=a;a<(p+10);a++) printf(″%d″,*a);
通过指针引用数组元素【例8.7】通过指针变量输出整型数组a的10个元素DPa数组#include<stdio.h>#include<stdio.h>a[0]int main()int main()int *p,i,a[10]://p的初值是a,p指向a[0]int i,a[10].*p=a;L//p指向a[0]p=a;printf("pleaseenter10 integer numbers:")printf("pleaseenter10 integernumbers:")for(i=0;i<10;i++)for(i=0;i<10;i++)scanf("%d".p++):scanf("%d"p++)://输入10个整数给a[0]~a[9]p=a://重新使p指向a[0]for(i=0:i<10:i++p++)for(i=0;i<10;i++,p++)2pa[9]printf("%d"*p)://想输出a[0]~a[9]2printf("%d",*p);printf("In"):printf("\n"):retum o:return 0;X1C:\WINDOWS)system32)cmd.exe-integeC:WINDOWS1system32/cmd.exe口X-8589934602-858993460-8589934605240960-858998993460按任音键继约mmber:0123456780nteger8意键继名
通过指针引用数组元素 【例8.7】通过指针变量输出整型数组a的10个元素。 #include <stdio.h> int main() { int *p,i,a[10]; p=a; //p指向a[0] ① printf("please enter 10 integer numbers:"); for(i=0;i<10;i++) scanf("%d",p++); //输入10个整数给a[0]~a[9] for(i=0;i<10;i++,p++) printf("%d ",*p); //想输出a[0]~a[9] ② printf("\n"); return 0; } #include <stdio.h> int main() { int i,a[10],*p=a; //p的初值是a,p指向a[0] printf("please enter 10 integer numbers:"); for(i=0;i<10;i++) scanf("%d",p++); p=a; //重新使p指向a[0] for(i=0;i<10;i++,p++) printf("%d ",*p); printf("\n"); return 0; } ① p a数组 a[0] ② p a[9]
通过指针引用数组元素(1)从例8.7可以看到,虽然定义数组时指定它包含10个元素,并用指针变量p指向某一数组元素,但是实际上指针变量p可以指向数组以后的存储单元,结果不可预期,应避免出现这样的情况。(2)指向数组元素的指针变量也可以带下标,如p]。p[]被处理成*(p+i),如果p是指向一个整型数组元素a[0],则p[代表a[]。但是必须弄清楚p的当前值是什么?如果当前p指向a[3],则p[2]并不代表a[2],而是a[3+2],即a[5]。(3)利用指针引用数组元素,比较方便灵活,有不少技巧。请分析下面几种情况:设p开始时指向数组a的首元素(即p=a)①2p++;/*由干++和+同优先级,结合方向自右而左,因此//使p指向下一元素a[1]*p++:它等价于*(p++)。先引用p的值,实现*p的运算,然后再使p//得到下一个元素a[1]的值*p:自增1*/3④*(p++)://先取*p值,然后使p加1++(*p):/+表示p所指向的元素值加1,如果p=a,则相当于++a[0]若a[0]的值为3,则a[0]的值为4。注意:是元素a[0]的//先使p加1,再取+p*(++p):值加1而不是指针p的值加1*/*(p--)//相当于a[i--1.先对p进行*”运算,再使p自减5如果p当前指向a数组中第i个元素ail,则*(++p)//相当于a[++il,先使p自加,再进行“*”运算//相当于a[--il,先使p自减,再进行“*”运算*(--p)
通过指针引用数组元素 (1) 从例8.7可以看到,虽然定义数组时指定它包含10个元素,并用指针变量p指向某一数组元素,但是实际上指针变量p 可以指向数组以后的存储单元,结果不可预期,应避免出现这样的情况。 (2) 指向数组元素的指针变量也可以带下标,如p[i]。p[i]被处理成*(p+i),如果p是指向一个整型数组元素a[0],则p[i]代 表a[i]。但是必须弄清楚p的当前值是什么?如果当前p指向a[3],则p[2]并不代表a[2],而是a[3+2],即a[5]。 (3) 利用指针引用数组元素,比较方便灵活,有不少技巧。请分析下面几种情况: 设p开始时指向数组a的首元素(即p=a): ① ② ③ ④ ⑤ 如果p当前指向a数组中第i个元素a[i],则: p++; //使p指向下一元素a[1] *p; //得到下一个元素a[1]的值 *p++; /*由于++和*同优先级,结合方向自右而左,因此 它等价于*(p++)。先引用p的值,实现*p的运算,然后再使p 自增1*/ *(p++); //先取*p值,然后使p加1 *(++p); //先使p加1,再取*p ++(*p); /*表示p所指向的元素值加1,如果p=a, 则相当于 ++a[0],若a[0]的值为3,则a[0]的值为4。注意: 是元素a[0]的 值加1,而不是指针p的值加1*/ *(p-) //相当于a[i-],先对p进行“*”运算,再使p自减 *(++p) //相当于a[++i],先使p自加,再进行“*”运算 *(-p) //相当于a[-i],先使p自减,再进行“*”运算
用数组名作函数参数int main()array是实参数组名,arr为形参数组名。当用数组名作参数voidfun(intarr.intn)://对fun函数的声明T时,如果形参数组中各元素的值发生变化,实参数组元素int array[10]://定义array数组:的值随之变化。//用数组名作函数的参数fun(array.10):returnO;array1arrarrayo]void fun(int arr. int n)//定义fun函数void fun(int *arr, int n)//定义fun函数arr[of(arr+31array/3]arr[3]在该函数被调用时,系统会在fun函数中建立一个指针变量arr:用来存放从主调函数传递过来的实参数组首元素的地址。如果在fun函数中用运算符sizeof测定arr所占的字节数,可以发现sizeof(arr)的值为4(用VisualC++时)。这就证明了系统是把arr作为指针变量来处理的(指针变量在VisualC++中占4个字节)。当arr接收了实参数组的首元素地址后,arr就指向实参数组首元素,也就是指向array[0]
用数组名作函数参数 void fun(int *arr, int n) //定义fun函数 { ⋮ } int main() { void fun(int arr[], int n); //对fun函数的声明 int array[10]; //定义array数组 ⋮ fun(array,10); //用数组名作函数的参数 return 0; } void fun(int arr[], int n) //定义fun函数 { ⋮ } array是实参数组名,arr为形参数组名。当用数组名作参数 时,如果形参数组中各元素的值发生变化,实参数组元素 的值随之变化。 ≡ array arr array[0] arr[0] arr+3 array[3] arr[3] 在该函数被调用时,系统会在fun函数中建立一个指针变量arr,用来存放从主调函数传递 过来的实参数组首元素的地址。如果在fun函数中用运算符sizeof测定arr所占的字节数, 可以发现sizeof(arr)的值为4(用Visual C++时)。这就证明了系统是把arr作为指针变量来处 理的(指针变量在Visual C++中占4个字节)。 当arr接收了实参数组的首元素地址后,arr就指向实参数组首元素,也就是指向array[0]