学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,是向后偏移一个整型

       

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

           

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

目录
打赏
0
0
0
0
4
分享
相关文章
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
3月前
|
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
73 6
|
4月前
|
内存数组越界
【10月更文挑战第14天】
56 1
基于类型化 memoryview 让 Numpy 数组和 C 数组共享内存
基于类型化 memoryview 让 Numpy 数组和 C 数组共享内存
81 0
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
56 0
探索Java内存模型:可见性、有序性和并发
在Java的并发编程领域中,内存模型扮演了至关重要的角色。本文旨在深入探讨Java内存模型的核心概念,包括可见性、有序性和它们对并发实践的影响。我们将通过具体示例和底层原理分析,揭示这些概念如何协同工作以确保跨线程操作的正确性,并指导开发者编写高效且线程安全的代码。
|
6月前
|
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
78 0
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
80 0
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
108 1