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;
    }
 }

### C语言 `time.h` 头文件使用说明 #### 函数和结构体概述 `time.h` 是C语言标准库的一部分,提供了处理日期和时间的功能。此头文件包含了用于获取当前日历时间和CPU时间的函数以及表示这些时间的数据类型的声明。 - **struct tm**: 此结构存储分解的时间信息,包括年份、月份、小时等字段[^1]。 ```c struct tm { int tm_sec; /* seconds */ int tm_min; /* minutes */ int tm_hour; /* hours */ int tm_mday; /* day of the month */ int tm_mon; /* month */ int tm_year; /* year */ int tm_wday; /* day of the week */ int tm_yday; /* day in the year */ int tm_isdst; /* daylight saving time */ }; ``` - **time_t 类型**: 表示日历时间的一个算术类型,在大多数实现中是一个长整数,代表自纪元以来经过的秒数(即从1970年11日午夜UTC到指定时间之间的秒数)。 #### 获取当前时间 为了获得当前的日历时间,可以使用 `time()` 函数: ```c #include <stdio.h> #include <time.h> int main(void){ time_t rawtime; // Get current calendar time as a time_t value. rawtime = time(NULL); } ``` 该函数返回的是一个 `time_t` 值,它通常用来作为其他转换函数的基础输入参数。 #### 将时间戳转为本地时间或协调世界时(UTC) 通过调用 `localtime()` 或者 `gmtime()` 可以把 `time_t` 转换成更易读的形式——即 `struct tm*` 结构指针指向的对象: ```c // Convert to local time and UTC respectively. struct tm *loc_time = localtime(&rawtime); struct tm *utc_time = gmtime(&rawtime); if (loc_time != NULL && utc_time != NULL) { printf("Local Time: %s", asctime(loc_time)); printf("UTC Time : %s", asctime(utc_time)); } ``` 这里需要注意的是这两个函数都返回静态分配的空间地址,因此不应该释放它们所返回的结果;而且如果并发访问可能会有线程安全方面的问题。 #### 时间格式化输出 对于想要按照特定格式打印时间的情况,则可利用 `strftime()` 来完成这一操作: ```c char buffer[80]; size_t result; result = strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", loc_time); if(result != 0){ puts(buffer); } else{ perror("strftime failed"); } ``` 上述例子会尝试将给定的时间对象按“YYYY-MM-DD HH:mm:ss”的模式填充至字符数组并最终显示出来。 #### 计算两个时刻之间差值 当需要计算两段时间间隔的时候,可以通过 `difftime()` 实现这一点: ```c double diff_seconds = difftime(time_end, time_start); printf("%.f seconds\n", diff_seconds); ``` 这将会给出结束时间和起始时间相差多少秒的信息。 #### 随机种子初始化 虽然这不是严格意义上的时间管理功能,但是值得一提的是,`time.h` 中提供的 `time()` 函数经常被用来设置随机数发生器的种子,从而使得每次运行程序产生的伪随机序列不同: ```c srand((unsigned int)time(NULL)); /* Now calls to rand() will produce different sequences on each run */ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值