900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > C语言指针基础知识点(四)--通过指针引用数组

C语言指针基础知识点(四)--通过指针引用数组

时间:2019-04-14 08:53:02

相关推荐

C语言指针基础知识点(四)--通过指针引用数组

指针系列目录

C语言指针基础知识点(一)–指针及指针变量

C语言指针基础知识点(二)–指针变量的引用

C语言指针基础知识点(三)–指针变量作为函数参数

C语言指针基础知识点(四)–通过指针引用数组

C语言指针基础知识点(五)–用数组名作函数参数

C语言指针基础知识点(六)–通过指针引用多维数组

C语言指针基础知识点(七)–通过指针引用字符串

C语言指针基础知识点(八)–返回指针值的函数

C语言指针基础知识点(九)–指针数组和多重指针

C语言指针基础知识点(十)–动态内存分配与指向它的指针变量

通过指针引用数组元素

引用一个数组元素,可以用以下两种方法:

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

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

栗子1:

有一个整型数组 a,有5个元素,要求输出数组中的全部元素

(1). 下标法

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

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

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

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

法一:

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

法二:

# include<stdio.h>int main(){int i,a[5],*p;printf("Please enter 5 integer numbers:\n");for(i=0;i<5;i++)scanf("%d",&a[i]);for(p=a;p<(a+5);p++) // 错误: for(p=a;a<(p+5);a++) a 代表数组首元素的地址,是一个指针型常量printf("%d ",*p); // printf("%d ",*a); printf("\n");return 0;}

栗子2:

通过指针变量输出整型数组 a 的5个元素

# include<stdio.h>int main(){int i,a[5],*p;p=a;printf("Please enter 5 integer numbers:\n");for(i=0;i<5;i++)scanf("%d",p++);for(i=0;i<5;i++,p++) // or for(i=0;i<5;i++)printf("%d ",*p); // printf("%d", *p++);printf("\n");return 0;}

结果为:

问题出在了指针变量p的指向上。指针p经过第一轮for循环后已经指向了数组a的末尾,执行第二个for循环时,指向a数组下面的10个存储单元,而这些单元中存储的值是难以预料的。

解决办法:

在第二个for循环之前加一个赋值语句:p = a

拓展:

while实现输出数组a的前 5 个元素 :

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。