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

大纲浏览

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

①数组元素的指针

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

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

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

注意:
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;
  }
  }
}
  • 21
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 指针是C语言中的一个重要概念。它可以用来指向变量、函数或其他内存地址。比如,假设您有一个变量int a,其值为5,那么您可以声明一个指针变量int *b,它将指向变量a的内存地址,这样就可以通过指针b来访问变量a的值。 ### 回答2: C语言中的指针是一种特殊的变量类型,它具有存储内存地址的能力。我们可以把指针看作是一个存放了另一个变量的地址的容器。 举个例子来说明:假设我们有两个C语言变量,一个是整数类型的a,另一个是指针类型的b。我们可以通过以下步骤来使用指针。 首先,我们定义一个整数变量a,并给它赋一个值,比如说10。然后,我们定义一个指针变量b,并将其指向a的地址。这可以通过使用取地址运算符&来实现,即`b = &a;`。现在,指针变量b存储了变量a的地址。 接着,我们可以使用解引用运算符*来访问指针变量所指向的地址上的值。我们可以通过在指针变量前面加上解引用运算符,来获得变量a的值,即`*b`。这将返回a的值,也就是10。 我们还可以通过指针来修改变量a 的值。我们只需使用解引用运算符来访问变量a,并将新的值赋给它,比如说`*b = 20;`。现在,变量a的值将变为20。 总体来说,指针可以帮助我们在程序中访问和操作内存中的数据,它提供了直接访问内存地址的能力,从而增加了程序的灵活性和效率。然而,指针的使用也需要谨慎,因为错误的指针操作可能会导致程序崩溃或运行出错。因此,在使用指针时要确保指针变量指向有效的内存地址,并避免悬空指针或野指针的出现。 ### 回答3: 在C语言中,指针是一种变量类型,用来存储内存地址。通过指针,我们可以直接访问和修改内存中存储的值。可以将指针比喻为一根手指,它指向某个特定的内存位置。 我们可以通过使用指针来提高程序的效率和灵活性。例如,我们可以使用指针来传递大量数据,而不需要复制整个数据。此外,指针也常用于动态内存分配,例如在运行时分配数组或其他数据结构。指针还可以在函数中返回多个值,而不仅仅是一个返回值。 让我们来看一个简单的例子来说明指针的使用。假设我们有两个整数变量a和b,我们想要交换它们的值。使用指针,我们可以这样做: ``` void swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } int main() { int a = 10; int b = 20; printf("交换前:a = %d, b = %d\n", a, b); swap(&a, &b); printf("交换后:a = %d, b = %d\n", a, b); return 0; } ``` 在这个例子中,我们给函数`swap`传递了`a`和`b`的地址(即指针),而不是它们的实际值。在函数内部,我们使用`*x`和`*y`来访问这些地址处存储的值,从而实现了交换操作。 通过这个例子,我们可以看到指针的使用方式。需要注意的是,在操作指针时,需要小心避免空指针和野指针的问题,以及内存泄漏等潜在的问题。因此,在使用指针时需要谨慎,并确保正确管理内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值