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

C语言标准函数

1. 堆内部存储器管理

  • malloc函数(动态内部存款和储蓄器分配):在堆中分配内定大小的一段连接的内部存款和储蓄器空间,重回那片内部存款和储蓄器的首地址。(分配内部存款和储蓄器空间)

    重临类型是 void* 类型,void*
表示未规定项指标指针。C,C++规定,void*
类型能够强制转换为任何其余类型的指针。

   (提示:在C中void*能够毫不强制转换,但在C++中必将要强转,不然编写翻译不通过报错;便于程序能移植到C++中,提议养成强制转换的习惯)

  C语言 1

    C语言 2

  • calloc函数:与malloc成效一样,只是暗中同意会把分配到的兼具字节都清零。(分配内部存储器空间 + 伊始化清零)

    calloc()函数有五个参数,分别为要素的多少和各种成分的尺寸,这八个参数的乘积便是要分配的内部存款和储蓄器空间的深浅。

    C语言 3

  • realloc函数:更改由malloc()函数分配的内部存款和储蓄器空间的轻重缓急。并将新的内部存储器指针再次回到。

    • 一旦将分配的内部存储器减弱,realloc仅仅是改变索引的音信。
    • 假若是将分配的内部存款和储蓄器扩展,则有以下情状:

      • 假如当前内部存款和储蓄器段后边有须要的内部存款和储蓄器空间,则平素扩张那段内部存款和储蓄器空间,realloc()将再次回到原指针。

      • 比方当前内部存款和储蓄器段后边的悠闲字节不够,那么就选取堆中的第5个可以满意这一须求的内部存款和储蓄器块,将如今的数额复制到新的职分,并将本来的多少块释放掉,重临新的内部存款和储蓄器块地方。 

      • 设若申请破产,将赶回NULL,此时,原来的指针还是有效。能够选用realloc函数对用malloc函数分配好的空中重新分配,一般是扩张。
    • 留意:若是调用成功,不管当前内部存款和储蓄器段后边的闲暇空间是或不是满意必要,都会放出掉原来的指针,重新赶回三个指针,就算回到的指针有大概和原先的指针一样,即不可能重复出狱掉原来的指针。

     C语言 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():将字符串转换为长整型值。

   C语言 5

3. 别样库函数

(1)可变长参数

   C语言 6

(2)日期和时间拍卖(time.h)

  • 时光处理函数

    clock函数

    difftime函数

    mktime函数

    time函数

  • 岁月转移函数

    asctime函数

    ctime函数

    gmtime函数

    localtime函数

(3)内部存款和储蓄器清理与拷贝(string.h)

   C语言 7

  C语言 8

预处理

1. 预总计机

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

  预处理:是将源程序中的预处理指令举办替换和拍卖。程序代码在付给给编写翻译器从前,先将一些代码替换(预处理)

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

2. 预拍卖指令

  预处理指令:以”#”起头的下令都以预处理指令。

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

  (能够出现在任何源程序地点,但必须一行结束,一条指令只可以是单排。一行即使写不完,就用”\”换行)

(1)文件包含:#include <> 或 #include “” : 将3个文本中的内容复制到当前地方

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

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

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

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

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

   无参宏定义(简单的宏):只做不难的更迭,升高程序的可读性和可维护性

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

   C语言 9

  C语言 10

  C语言 11

  C语言 12

    C语言 13

    C语言 14

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

规范编写翻译指令将决定如何代码被编写翻译,而如何是不被编写翻译的。

在代码中设置编写翻译条件,根据编写翻译条件实行代码的编译并运维。(跨平台)

C语言,在编写翻译文件的时候传出1个参数,依据参数就可以对代码进行有采用的编写翻译。

    C语言 15

    #ifdef 和 #ifndef  那两边主要用于制止头文件再次包涵。

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

     C语言 16

     C语言 17