c语言-指针

1、指针遍历一维数组

定义一个数组和一个指针,将a的首地址给p,然后让p进行++或者--。

2、指针实现元素逆置

对于一个数组a[10],定义两个指针,分别为p,q,p=a[0],q=a[9]再做一个do-while循环。
代码如下:
  do{
  //让t来作为中间介质达到交换*p和*q的值
   t=*p;
   *p=*q;
   *q=t;
   p++;
   q--;
  }while(p<q);//直到p从0向后移动,q从最后一个向后移动到p>=q时结束`

3、指针将前m个数移动到最后

将前m个数进行逆置,再将后n-m个数逆置,最后整体逆置。
代码如下:
#include <stdio.h>
#define N 20
int main()
 {
    int a[N];
    int i,n,m,t,j=0; 
    int *p,*q;
    scanf("%d",&n);//输入整数个数
    for(i=0;i<n;i++)
{
    scanf("%d",&a[i]);//输入数组
}
   p = a;

   scanf("%d",&m);//输入移动位数
/***** 首先逆置数组前m个元素 *****/
/********** Begin *********/
   q=&a[m-1];
do
 {
     t=*p;
    *p=*q;
    *q=t;
     p++;
     q--;
   }while(p<q);
/********** End **********/
/***** 逆置余下n-m个元素 *****/
/********** Begin *********/
   q=&a[n-1];
   p=&a[m];
  do{
   t=*p;
   *p=*q;
   *q=t;
   p++;
   q--;
  }while(p<q);

 /********** End **********/
/***** 逆置整个数组 *****/
/********** Begin *********/
   q=&a[n-1];
   p=&a[0];
do{
    t=*p;
    *p=*q;
   *q=t;
    p++;
    q--;
}while(p<q);

/********** End **********/
for(i=0;i<n;i++)
{  
    printf("%d ",a[i]);
}
printf("\n");
return 0;
}

4、用指针方法将n个整数按升序排列

1、选择法排序

第 1 趟在 n 个整数中,选出一个最小值和无序序列的第 1 个数交换;
第 2 趟在剩下的 n-1 个整数中,选出一个最小值和无序序列的第 2 个数交换;
以此类推,n 个数共选 n-1 趟。
并且每次循环指针指向剩下元素的第一个元素,由此找出最小值与前面的交换。
代码如下:
   #include<stdio.h>
   #define N 20
   main()
   {
      int a[N],*p,t,*q,i=0;
      int n;
      scanf("%d",&n);
      for( p=a; p < a+n; p++)
      {
	    scanf("%d",p);
      }
/***** 用选择法排序 *****/
/********** Begin *********/
      q=&a[0];
     for(i=0;i<n-1;i++)
     {   
	     q=&a[i];//每次循环都要选择一个数*q
		 //内部循环从*q对应的下标的后一个数开始
	 for(p=a+i;p<a+n;p++)
	{
     if(*p<*q)//每循环一次都和选择的那个数*q进行比较,若小于*q,则将地址传给q
	 {
		 q=p;
	 }
	}
        //若不满足if语句,则q还是原来那个被选择的数,二者进行如下交换无任何影响
	//若满足if语句,则此时q存的是p的地址,而a[i]则表示的是之前选择的数*q的值,将二者按以下代码进行位置交换
    t=*q;
	*q=a[i];
    a[i]=t;

     }

/********** End **********/
  for(p=a; p < a+n; p++)
   {
	printf("%d ",*p);
   }
   printf("\n");
   return 0;
 }

5、指针指向二维数组

有这样的一个数组a[N][M],则定义一个指向二维数组的行指针 (p)[M]=a,这里的(p)可看作是指向一维数组a[N],p的首地址是a[0]的首地址。
a[i]=a+i。
先定行,再逐列查找:*(p+i)+j)
或者定义一个列指针 p,让其指向数组的首个元素。则二维数组中的任意一个元素都可以用(p+i*M+j)来表示。
代码如下:
  for(i=0;i<N;i++)
  {
	for(j=0;j<M;j++)
	{
		scanf("%d",*(p+i)+j);
	}
   }

6、指针数组

指针数组是一组有序的指针变量的集合。
指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
指针数组说明的一般形式为:类型说明符 *数组名[数组长度]
对于一个二维数组a[N][M],则可用一个指针数组表示 int *p[N]。
即为一个指针数组中有M个指针,而每个指针都各自指向一个数组,故而直接对p进行加减,则移动的是一个数组的字节。
数组中的每个指针都被赋予了数组各行的首地址。
则要想换行,只需要对p进行++,换列则对*p进行++。
则用指针输入数组,如下:
相关代码如下:
  #include<stdio.h>
  #define N 3
  #define M 5
  int main()
  {
     int a[N][M];
     int *p[N] ;//定义一个int型的指针数组
     int i,j,sum;
	 //给指针数组进行赋值
    for(i=0;i<N;i++)
    { 
	    for(p[i] = a[i]  ; p[i] < a[i]+M ; p[i]++)
	  {
		scanf("%d",p[i]);
	   }
    }
/********** Begin *********/
//利用指针数组进行数组元素和运算,并输出
  for(i=0;i<N;i++)
  {      sum=0;
     for(p[i]=a[i];p[i]<a[i]+M;p[i]++)
    {
	   sum=sum+*p[i];
     }
   printf("第%d行和为:%d\n",i,sum);
  }
	
 /********** End **********/
    return 0;
 }
posted @ 2022-04-01 09:37  i_归零  阅读(177)  评论(0编辑  收藏  举报