【C语言篇】☞ 16. 标准函数、预处理

C语言标准函数

1. 积聚内存管理

  • malloc函数(动态内存分配):在积中分红指定大小的同样段连接的内存空间,返回就片内存的首地址。(分配内存空间)

    返回路是 void* 类型,void*
表示未规定项目的指针。C,C++规定,void*
类型可以强制转换为任何其他项目的指针。

   (提示:在C中void*好毫无强制转换,但以C++中得要强转,否则编译不经过报错;便于程序能够移植到C++中,建议养成强制转换的习惯)

  图片 1

    图片 2

  • calloc函数:与malloc作用一样,只是默认会把分配至之持有字节都清零。(分配内存空间 + 初始化清零)

    calloc()函数有少单参数,分别吗要素的多少及每个元素的轻重缓急,这简单个参数的积就是如分配的内存空间的分寸。

    图片 3

  • realloc函数:更改由malloc()函数分配的内存空间的轻重。并以新的内存指针返回。

    • 假如用分配的内存减少,realloc仅仅是改变索引的音讯。
    • 假使是以分配的内存扩大,则有以下情况:

      • 倘手上外存段后面来亟待的内存空间,则直接扩展这段内存空间,realloc()将回原指针。

      • 要手上内存段后面的悠闲字节不够,那么就运堆中的首先独能够满足这同样渴求的外存块,将手上底数额复制到新的职位,并以原先的多少块释放掉,返回新的内存块位置。 

      • 若果申请破产,将回到NULL,此时,原来的指针仍然有效。可以利用realloc函数对因此malloc函数分配好之空间重新分配,一般是扩大。
    • 专注:如果调用成功,不管当前外存段后面的悠闲空间是否满足要求,都见面自由掉原来的指针,重新赶回一个指针,虽然归的指针有或跟本的指针一样,即不能够还出狱掉原来的指针。

     图片 4

  • free函数:释放内存空间

    free(p); //释放指针p所依赖的内存空间

2. 正规输入输出

(1)控制高输入输出,可以接受用户从键盘上输入的数码

  • scanf()在输入字符的下是缓冲区问题

    通过scanf(”%*c”);清除缓冲区。

  • scanf()和gets()在输入字符串的时刻不有缓冲区问题,但在安全性问题(内存溢出)  
  • fgets()函数,解决安全性问题
    • 语法格式:fgets(参数1,参数2,参数3);
      • 参数1:保存数据的首职务
      • 参数2:保存的长度(包括了符)
      • 参数3:stdin(标准控制高输入)

(2)格式化输入输出

  • printf()可以输出字符串,并且可依据占位符的个数来控制输出字符串的个数。
  • puts()可以输出一个字符串,而且是机动换行。

  • printf()与puts

    • 相同点:都可输出字符串

    • 不同点:

      • printf()需要手动换行,可以频繁出口字符

      • puts()自动换行,只能输出一涂鸦字符串内容

  • const关键字:可以将变量变为单独读,只可以在初始化时转变量的价,此变量就也常量。

    • const int*p =
      &i;
      //指针指向的值变为单独读
    • int *const p = &i; //指针的值变为单纯念

(3)数据类型之间的换

  • sprintf函数,可以将各种数码类(整型、长整型、浮点型等)转换为字符串。
  • 拿字符串转换为擅自档次(整型、长整型、浮点型等)。

    • atof():将字符串转换为对精度浮点型值。
    • atoi():将字符串转换为整型值。

    • atol():将字符串转换为长整型值。

   图片 5

3. 其他库函数

(1)可变长参数

   图片 6

(2)日期及时空拍卖(time.h)

  • 光阴处理函数

    clock函数

    difftime函数

    mktime函数

    time函数

  • 光阴转移函数

    asctime函数

    ctime函数

    gmtime函数

    localtime函数

(3)内存清理与拷贝(string.h)

   图片 7

  图片 8

预处理

1. 预计算机

  预处理器是一个主次,用来处理源程序中的预先处理指令,一个源程序在编译前要先期做事先处理。

  预处理:是将源程序中的先行处理指令展开调换和处理。程序代码在提交给编译器之前,先将有些代码替换(预处理)

  命令:gcc(clang) -E xxx.c //(-E)只做先处理

2. 预甩卖指令

  预处理指令:以”#”开头的授命都是预先处理指令。

  如:#include,
#define, 条件编译指令(#if, #ifdef, #ifndef,
#endif…)

  (可以起于任何源程序位置,但必须一行结束,一长条指令只能是单排。一行要写不结,就就此”\”换行)

(1)文件包含:#include <> 或 #include “” : 将一个文件中之情节复制到即岗位

#include在干什么:找到一个文件,将文件中的内容全部拷贝到此。(是预处理指令,由预处理器来处理的)

#include <stdio.h> 和 #include " "

<>的意思是从系统指定的位置查找文件。stdio.h是系统标准的头文件,保存在系统指定的位置,所以用<>

“” 从当前目录查找文件,如果在当前目录下找不着,就再到系统指定的目录下找

(2)宏定义:#define 用来定义宏,宏是一种植代码替换技术。

   无参宏定义(简单的偌大):只开简单的更迭,提高程序的可读性和可维护性

   #define PI 3.1415926 //定义了一个宏大,名字是PI 用于替换3.14

   图片 9

  图片 10

  图片 11

  图片 12

    图片 13

    图片 14

(3)条件编译指令(#if, #ifdef, #ifndef, #endif, #elif, #else, #undef, #defined, #error)

原则编译指令以决定如何代码被编译,而什么是免让编译的。

在代码中安编译条件,根据编译条件进行代码的编译并运行。(跨平台)

以编译文件之时段传出一个参数,根据参数就可以对代码进行有取舍的编译。

    图片 15

    #ifdef 和 #ifndef  这二者主要用来防止头文件再次包含。

    #if defined 等价于 #ifdef;  #if !defined 等价于 #ifndef

     图片 16

     图片 17