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

       

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

           

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

相关文章
|
10月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
437 15
|
消息中间件 存储 缓存
kafka 的数据是放在磁盘上还是内存上,为什么速度会快?
Kafka的数据存储机制通过将数据同时写入磁盘和内存,确保高吞吐量与持久性。其日志文件按主题和分区组织,使用预写日志(WAL)保证数据持久性,并借助操作系统的页缓存加速读取。Kafka采用顺序I/O、零拷贝技术和批量处理优化性能,支持分区分段以实现并行处理。示例代码展示了如何使用KafkaProducer发送消息。
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
1800 13
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
568 12
|
存储 C语言 开发者
C 语言指针与内存管理
C语言中的指针与内存管理是编程的核心概念。指针用于存储变量的内存地址,实现数据的间接访问和操作;内存管理涉及动态分配(如malloc、free函数)和释放内存,确保程序高效运行并避免内存泄漏。掌握这两者对于编写高质量的C语言程序至关重要。
599 11
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
容器
在使用指针数组进行动态内存分配时,如何避免内存泄漏
在使用指针数组进行动态内存分配时,避免内存泄漏的关键在于确保每个分配的内存块都能被正确释放。具体做法包括:1. 分配后立即检查是否成功;2. 使用完成后及时释放内存;3. 避免重复释放同一内存地址;4. 尽量使用智能指针或容器类管理内存。
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
419 6
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
1181 1