【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