学C的第二十三天【继续深度剖析数据在内存中的存储:3. 浮点型在内存中的存储(重点);练习:1. 有序序列判断;2. 获得月份天数(多组输入);3. 使用指针打印数组内容;4. 使用指针使字符串逆序】-3

简介: (2). 方法二 -- 用数组存储各月的日期(妙呀~):

(2). 方法二 -- 用数组存储各月的日期(妙呀~):

//描述
//KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。
//输入描述:
//多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。
//输出描述:
//针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。
#include <stdio.h>
//平年:
// 1  2  3  4  5  6  7  8  9  10 11 12
// 31 28 31 30 31 30 31 31 30 31 30 31
// 
//闰年:
// 1  2  3  4  5  6  7  8  9  10 11 12
// -- 29 -- -- -- -- -- -- -- -- -- --
// 1 3 5 7 8 10 12 -- 31天
// 4 6 9 11 -- 30天
// 2月 特殊
int get_days_of_month(int y, int m)
{
  int d = 0;
  int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
  //         0 1  2  3  4  5  6  7  8  9  10 11 12
  //使用一个数组把 日期 放进去,把第一个元素随便设置,
  //让1月下标为1,2月下标为2,以此类推
  d = days[m]; //刚好传进来的月份对应数组中的月份下标
  if (((y%4==0 && y%100!=0) || (y%400==0)) && m==2)
    //如果是闰年 并且 月份是2月
  {
    d += 1;//在平年2月的基础上再加1变成29日
  }
  return d;
}
int main()
{
  int y = 0;//年
  int m = 0;//月
  //多组输入:
  while (scanf("%d %d", &y, &m) == 2)
  {
    int d = get_days_of_month(y, m);
    //写个函数计算该年该月的日期,
    //参数为 y 和 m
    //返回值为 对于日期
    printf("%d\n", d);
  }
  return 0;
}

image.png

3. 使用指针打印数组内容

           

(1). 方法一 -- 用for循环进行循环打印:

//使用指针打印数组内容
#include <stdio.h>
int main()
{
  float arr[] = { 3.14f, 99.9f, 66.5f, 0.0f };
  float* p = arr; //把数组名(首地址)放进指针中
  int sz = sizeof(arr) / sizeof(arr[0]); //元素个数
  //使用指针打印数组内容
  int i = 0;
  for (i = 0; i < sz; i++)
  {
    printf("%f ", *p);
    p++;
  }
  return 0;
}

44489cdee49b4ff1afe57ee8e49c088e.png

                   

(2). 方法二 -- 用while循环进行循环打印:

//使用指针打印数组内容
#include <stdio.h>
int main()
{
  float arr[] = { 3.14f, 99.9f, 66.5f, 0.0f };
  float* p = arr; //把数组名(首地址)放进指针中
  int sz = sizeof(arr) / sizeof(arr[0]); //元素个数
  float* q = arr + sz; //使用指针表示元素个数
  //使用指针打印数组内容
  while (p < q)//对比地址大小来判断用不用打印
  {
    printf("%f ", *p++);//先解引用再p++
  }
  return 0;
}

8bc24a4288b64a2c85bf38a69ea19c3c.png

(3). 自定义函数用while循环进行循环打印:

//使用指针打印数组内容
#include <stdio.h>
void print(float* p, int sz)
{
  float* q = p + sz; //使用指针表示元素个数
  //使用指针打印数组内容
  while (p < q)//对比地址大小来判断用不用打印
  {
    printf("%f ", *p++);//先解引用再p++
  }
}
int main()
{
  float arr[] = { 3.14f, 99.9f, 66.5f, 0.0f };
  float* p = arr; //把数组名(首地址)放进指针中
  int sz = sizeof(arr) / sizeof(arr[0]); //元素个数
  print(arr, sz); //调用自定义函数
  return 0;
}


image.png

4. 使用指针使字符串逆序

//字符串逆序
#include <stdio.h>
#include <string.h>
int main()
{
  char arr[10001] = { 0 };
  gets(arr);//输入数组数据,gets可以把空格也读入
  int len = strlen(arr);
  //进行逆序:使用 left 和 right
  char* left = arr; //左指针
  char* right = arr + len - 1; //右指针
  while (left < right)//两指针中间还有值就继续换
  {
    char tmp = *left;
    *left = *right;
    *right = tmp;
    left++;
    right--;
  }
  printf("%s\n", arr);
  return 0;
}


image.png

补充:

             

  • 32位系统下:

int4个字节指针表示地址空间个数,总共有2^32个,故占4个字节

  • 64位系统下:

int4个字节指针表示地址空间个数,总共有2^64个,故占8个字节

  • 整型指针+1,是向后偏移一个整型

       

  • 指针 - 指针 得到的是 指针和指针之间的元素个数

           

  • 指针就是地址指针比较大小,就是地址比较大小地址也是有大小之分

相关文章
|
8天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
3天前
|
存储 C++
C++程序数组与指针:深入理解与实践
C++程序数组与指针:深入理解与实践
11 1
|
1天前
|
C语言
C语言指针——练习
C语言指针——练习
|
3天前
|
算法 C语言
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)(下)
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)
9 0
|
3天前
|
C语言
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)(中)
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)
14 0
|
3天前
|
C语言
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)(上)
C语言进阶⑫(指针下)(指针和数组笔试题解析)(杨氏矩阵)
14 0
|
3天前
|
存储 C++
C++程序中的字符串与指针
C++程序中的字符串与指针
9 2
|
8天前
指针应用基础练习
指针应用基础练习
8 0
|
8天前
|
存储 人工智能
指针的应用练习(数组与指针的关系)
指针的应用练习(数组与指针的关系)
16 0