通过指针引用数组(包含多种例子,清晰易懂)

大纲浏览

①数组元素的指针
 ②在引用数组元素时指针的运算
 ③通过指针引用数组元素
 ④用数组名作函数参数
 ⑤通过指针引用多维数组

①数组元素的指针

一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址

指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中)

所谓数组元素的指针就是数组元素的地址

注意:
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;
  }
  }
}
发布了148 篇原创文章 · 获赞 56 · 访问量 3676

猜你喜欢

转载自blog.csdn.net/qq_45696288/article/details/104683923