大纲浏览
①数组元素的指针
②在引用数组元素时指针的运算
③通过指针引用数组元素
④用数组名作函数参数
⑤通过指针引用多维数组
①数组元素的指针
一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址
指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)
所谓数组元素的指针就是数组元素的地址
注意:
p=&a[0]等价于p=a(p的值是数组a首元素a[0]的地址)
②在引用数组元素时指针的运算
在指针指向数组元素时,允许以下运算:
加一个整数(用+或+=),如p+1
减一个整数(用-或-=),如p-1
自加运算,如p++,++p
自减运算,如p–,–p
两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义)
③通过指针引用数组元素
引用一个数组元素,可用下面两种方法:
(1) 下标法,如a[i]形式
(2) 指针法,如*(a+i)或*(p+i)
其中a是数组名,p是指向数组元素的指针变量,其初值p=a
有关③的例题: 有一个整型数组a,有10个元素,要求输出数组中的全部元素。
解题思路:引用数组中各元素的值有3种方法:
(1)下标法;
(2)通过数组名计算数组元素地址,找出元素的值;
(3) 用指针变量指向数组元素
方法一:下标法
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
int a[10],i;
printf("请输入10个整数:");
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
for(i=0;i<10;i++){
printf("%3d",a[i]);
}
}
方法二:通过数组名计算数组元素地址,找出元素的值
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
int a[10],i;
printf("请输入10个整数:");
for(i=0;i<10;i++){
scanf("%d",a+i);//a+i可以换为&a[i]
}
for(i=0;i<10;i++){
printf("%3d",*(a+i));
}
}
方法三:用指针变量指向数组元素
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
int a[10],*p;
printf("请输入十个整数:");
// for(i=0;i<10;i++){
//scanf("%d",&a[i]);//&a[i]可以换为a+i
for(p=a;p<(a+10);p++){
scanf("%d",p);
}
//上面的p++结束后,需要对p重新初始化,令p=a
for(p=a;p<(a+10);p++){
printf("%3d",*p);
}
}
有关③的例题: 通过指针变量输出整型数组a的10个元素。
解题思路:
用指针变量p指向数组元素,
通过改变指针变量的值,使p先后指向a[0]到a[9]各元素。
/* Note:Your choice is C IDE */
#include "stdio.h"
void main()
{
int a[10],i,*p=&a;//此处的*p=&a等同于 int *p; p=a;
printf("请输入10个整数:");
for(i=0;i<10;i++){
scanf("%d",p++);
}
p=a;//上面的p++后要使p=a进行初始化后面才能正常使用
for(i=0;i<10;i++,p++){
printf("%3d",*p);
}
}
④用数组名作函数参数
用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一个指针变量
C编译都是将形参数组名作为指针变量来处理的
实参数组名是指针常量,但形参数组名是按指针变量处理
在函数调用进行虚实结合后,它的值就是实参数组首元素的地址
在函数执行期间,形参数组可以再被赋值
void fun (arr[ ],int n)
{
printf(″%d\n″, *arr);
arr=arr+3;
printf(″%d\n″, *arr);
}
有关④的例题: 将数组a中n个整数按相反顺序存放
解题思路:将a[0]与a[n-1]对换,……将a[4]与a[5]对换。
/* Note:Your choice is C IDE */
#include "stdio.h"
void fan(int b[],int n);//函数的调用
void main()
{
int i,a[10]={
1,3,4,5,2,6,8,7,9,-6};
//先将这10个数输出来
for(i=0;i<10;i++)
printf("%3d",a[i]);
printf("\n");
fan(a,10);
for(i=0;i<10;i++)
printf("%3d",a[i]);
}
void fan(int x[],int n)
{
int t,i,j,m=(n-1)/2;
for(i=0;i<=m;i++){
//也可以令m=n/2;则变为i<m;
j=n-1-i;
t=x[i];
x[i]=x[j];
x[j]=t;
}
}
注意,上面的fan函数可以进行优化
void fan(int x[],int n)
{
int t,*i,*j;
i=x;//数组x[]的第一个元素即x[0]
j=x+n-1;
for(i=x;i<j;i++,j--){
t=*i;
*i=*j;
*j=t;
}
}
结果显示
1 3 4 5 2 6 8 7 9 -6
-6 9 7 8 6 2 5 4 3 1
对上面的代码进行改写,用指针变量作实参
/* Note:Your choice is C IDE */
#include "stdio.h"
void fan(int *x,int n);
void main()
{
int i,a[10],*p=a;//指针p指向a[0]
for(i=0;i<10;i++,p++)
scanf("%d",p);
p=a;//必不可少,指针变量p重新指向a[0]
fan(p,10);//调用,实参p是指针变量
for(p=a;p<a+10;p++)
printf("%3d",*p);
}
void fan(int *x,int n)//定义fan函数,形参x是指针变量
{
int *y,*i,*j,t,m;
m=(n-1)/2;
i=x;
j=x+n-1;
y=x+m;
for(i=x;i<=y;i++,j--){
//i,x,y,j都是地址,所以不能用i<=m,因为m是实数
t=*i;
*i=*j;
*j=t;
}
}
有关④的例题: 用指针方法对10个整数按由大到小顺序排序。
解题思路:
在主函数中定义数组a存放10个整数,定义int *型指针变量p指向a[0]
定义函数sort使数组a中的元素按由大到小的顺序排列
在主函数中调用sort函数,用指针p作实参
用选择法进行排序
/* Note:Your choice is C IDE */
#include "stdio.h"
void sort(int x[],int t);
void main()
{
int i,a[10],*p=a;//直接对p进行了初始化,相当于p=a
printf("请输入10个整数:");
for(i=0;i<10;i++)
scanf("%d",p++);
p=a;//指针变量p重新指向a[0]
sort(p,10);
for(p=a;p<a+10;p++)//指针变量p重新指向a[0]
printf("%3d",*p);
}
void sort(int x[],int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++){
//进行9次循环,实现9趟比较
k=i;
for(j=i+1;j<n;j++) //在每一趟中进行9-i次比较
if(x[j]>x[k]) k=j;//x[j]>x[k]可以改为x[j]>x[i]
if(k!=i){
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
}
上面的代码比较复杂难以理解,下面进行优化
进行整改将sort函数用冒泡排序的方法
/* Note:Your choice is C IDE */
#include "stdio.h"
void sort(int x[],int t);
void main()
{
int i,a[10],*p=a;//直接对p进行了初始化,相当于p=a
printf("请输入10个整数:");
for(i=0;i<10;i++)
scanf("%d",p++);
p=a;//指针变量p重新指向a[0]
sort(p,10);
for(p=a;p<a+10;p++)//指针变量p重新指向a[0]
printf("%3d",*p);
}
void sort(int x[],int n)//使用冒泡排序的方法
{
int i,j,k,t;
for(i=0;i<n-1;i++){
//进行9次循环,实现9趟比较
for(j=0;j<n-1-i;j++) //在每一趟中进行9-i次比较
if(x[j+1]>x[j]){
t=x[j];
x[j]=x[j+1];
x[j+1]=t;
}
}
}
鉴于上面运算的复杂性,先使用改用指针变量的方式求解
/* Note:Your choice is C IDE */
#include "stdio.h"
void sort(int x[],int t);
void main()
{
int i,a[10],*p=a;//直接对p进行了初始化,相当于p=a
printf("请输入10个整数:");
for(i=0;i<10;i++)
scanf("%d",p++);
p=a;//指针变量p重新指向a[0]
sort(p,10);
for(p=a;p<a+10;p++)//指针变量p重新指向a[0]
printf("%3d",*p);
}
void sort(int *x,int n)
{
int i,j,k,t;
for(i=0;i<9;i++){
k=i;
for(j=i+1;j<n;j++)
if (*(x+j)>*(x+k)) k=j;
if(k!=i){
t=*(x+i);
*(x+i)=*(x+k);
*(x+k)=t;
}
}
}
今天的文章通过指针引用数组(包含多种例子,清晰易懂)分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/28147.html