C语言学习之指针.day1

学完C语言的 数据类型,顺序,分支,循环结构,数组等内容,已经能够实现一些小程序的编写了,但如何简化程序,成为一个C语言进阶者?

 必须理解和熟练指针的使用。

1.通过指针变量访问整型变量。

#include<stdio.h>
int main()
{
   int a=100,b=10;
   int *pointer_1,*pointer_2;
   //2个指向整型数据指针
   pointer_1=&a;
   pointer_2=&b;
   printf("a=%d,b=%d\n",a,b);
   printf("*point_1=%d,*point_2=%d\n",*pointer_1,*pointer_2);
   //输出a,b的地址
   return 0;
}

2.输入a和b两个整数,按先大后小的顺序输出a和b。

#include<stdio.h>
int main()
{
// 输入a和b两个整数,按先大后小的顺序输出a和b。
   int *p1,*p2,*p;
   int a,b;
   printf("请输入两个整数:\n");

   scanf("%d%d",&a,&b);
   p1=&a;//p1指向变量a
   p2=&b;//p2指向变量b
   if(a<b)
   {//p1与p2指向的变量交换
      p=p1;
      p1=p2;
      p2=p;
   }
   printf("a=%d,b=%d\n",a,b);//输出a,b
   printf("max=%d,min=%d",*p1,*p2);//输出p1,p2指向的值
   return 0;
}

3.输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。

#include<stdio.h>
int main()
{
  void swap(int *x,int *y);//函数声明
  int a,b;
  int *p1,*p2;//定义两个整型指针变量
  printf("请输入a和b:\n");
  scanf("%d%d",&a,&b);

   p1=&a;//p1指向变量a
   p2=&b;//p2指向变量b
   if(a<b)
   swap(p1,p2);//进行函数调用,如果a<b,交换
   //a=*p1,b=*p2
   printf("max=%d\tmin=%d\n",a,b);
   printf("max=%d\tmin=%d\n",*p1,*p2);

   //p1=&a p2=&b
   printf("%d\t%d\n",p1,p2);
   printf("%d\t%d\n",&a,&b);
   return 0;
}
void swap(int *x,int *y)//函数定义
{
   int t;      //交换地址
   t=*x;
   *x=*y;
   *y=t;
}

4.输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。(与题3相同方法)

#include<stdio.h>
int main()
{
  //输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。
  int a,b,c;
  int *p1,*p2,*p3;
  printf("请输入3个整数:\n");
  scanf("%d%d%d",&a,&b,&c);//输入3个数
  p1=&a;  //定义3个整型指针变量,指向a,b,c
  p2=&b;
  p3=&c;
  void max3(int *x,int *y,int *z);//函数声明
  max3(p1,p2,p3);//函数调用
  printf("由大到小排序:%d %d %d\n",a,b,c);
   //打印结果
  return 0;
}

 void max3(int *x,int *y,int *z)//函数定义
{
   void swap(int *m,int *n);//swap函数声明
   if(*x<*y)swap(x,z);//调用
   if(*x<*z)swap(x,z);
   if(*y<*z)swap(y,z);

}
 void swap(int *m,int *n)//swap函数定义
 {
   if(*m<*n)
   {
      int s;
      s=*m;
      *m=*n;
      *n=s;
   }

 }

5.有一个整型数组a,有10个元素,要求输出数组中的全部元素。
   3种方式输出,用指针速度快

#include<stdio.h>
int main()
{
   int a[10];
	int i;
	int *p=a;//p指针指向a数组首地址
	printf("please enter 10 integer numbers:\n");
	for(i=0;i<10;i++)
	scanf("%d",&a[i]);//输入10个数
	for(i=0;i<10;i++)
      printf("%d\t",a[i]);
      printf("\n");
      //数组元素用数组名和下标表示
   for(i=0;i<10;i++)
      printf("%d\t",*(a+i));
      printf("\n");
      //通过数组名和元素序号计算元素地址找到该元素
   for(p=a;p<(a+10);p++)
	printf("%d\t",*p);
	//用指针指向当前的数组元素
	return 0;
 }

6.将数组a中n个整数按相反顺序存放。

#include<stdio.h>
int main()
{
  //将数组a中n个整数按相反顺序存放。
  void inv(int x[],int n);//函数声明
  int i;
  int a[10]={3,7,9,11,0,6,7,5,4,2};
  printf("The original array:\n");
  for(i=0;i<10;i++)
  printf("%3d",a[i]);//打印原数组
  printf("\n");

  inv(a,10);//函数调用
  printf("The array has been inverted:\n");
  for(i=0;i<10;i++)
  printf("%3d",a[i]);//输出改变后的数组
 }

 void inv(int x[],int n)//函数定义
 {
    int temp,i,j;
    int m=(n-1)/2;
    for(i=0;i<=m;i++)//i:前5个 j:后5个 前后对调
    {
       j=n-1-i;
       temp=x[i];
       x[i]=x[j];
       x[j]=temp;
    }
 }

7.练习用指针变量作实参

#include<stdio.h>
int main()
{
  //将数组a中n个整数按相反顺序存放。
  //用指针变量作实参
  void inv(int *x,int n);//函数声明
  int i,*arr;
  printf("The original array:\n");
  for(i=0;i<10;i++)
   scanf("%2d",arr+i);//未给arr指针指向一个内存地址,编译器会警告
  printf("\n");

  inv(arr,10);//函数调用
  printf("The array has been inverted:\n");
  for(i=0;i<10;i++)
   printf("%2d",*(arr+i));
  printf("\n");
  return 0;
 }

 void inv(int *x,int n)//函数定义
 {
    int *p,*i,*j;
    int m,temp;
    m=(n-1)/2;
    i=x;//i指向x指针
    j=x+n-1;//j指向 与x指针相隔n-1的地址
    p=x+m;//p指向   与x指针相隔m的地址
    for(;i<=p;i++,j--)
    //i指针指向的地址变化到p指针指向的地址  首尾互换
    {
       temp=*i;
       *i=*j;
       *j=temp;
    }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值