先看一组代码:
#include <stdio.h> void main() { int i,*p,a[7]; p=a; for(i=0;i<7;i++) scanf("%d",p++); printf(" "); for(i=0;i<7;i++,p++) printf("%d",*p); }
我们输入7个数,但输出的结果却是随机数。产生的原因为程序执行完第一组for循环后,指针已经指到了数组后的内存单元,如果想要输出该数组元素,则需重新将其首地址赋值给p(p=a)。
以下是改正的版本————————————————
当然我们还可以将p++替换为p+i;以下为参考代码————————————————
#include <stdio.h> void main() { int i,*p,a[7]; p=a; for(i=0;i<7;i++) scanf("%d",p+i); printf(" "); for(i=0;i<7;i++) printf("%3d",*(p+i)); }
其好处是从第二次循环后都不需要重新将指针指回数组首元素。
方法 | a[0]地址 | a[1]地址 | a[i]地址 |
通过数组元素名 | a[0] | a[1] | a[i] |
通过数组名a | *a | *(a+1) | *(a+i) |
通过指针变量p | *p | *(p+1) | *(p+i) |
下标法 | p[0] | p[1] | p[i] |
因为p指向a的首地址,即a[0],所以a[i]=>*(a+i)=>*(p+i)。
下一题用p+i有明显的优势————————
输入十名学生成绩,计算平均分,输出高于平均分的成绩,使用指针完成该操作。
我们先用p++,可以看到每循环一次都得重置p=a;
#include <stdio.h> void main() { int a[10],sum=0,*p,i; float v; p=a; for(i=0;i<10;i++,p++) scanf("%d",p); p=a; for(i=0;i<10;i++,p++) sum+=*p; v=sum/10; printf("%f ",v); p=a; for(i=0;i<10;i++,p++) if(*p>v) printf("%3d",*p); }
而用p+i的话则不需要————————————
#include <stdio.h> void main() { int a[10],*p,i,sum=0; float v; p=a; for(i=0;i<10;i++) scanf("%d",p+i); for(i=0;i<10;i++) sum+=*(p+i); v=sum/10; printf("%f ",v); for(i=0;i<10;i++) if(*(p+i)>v) printf("%3d",*(p+i)); }