C高级知识

结构体指针

  • 一个指向结构体变量的指针,指向结构体变量的起始地址

  • 定义:结构体类型 *指针名 struct student *p

  • 访问结构体成员:(*p).name 或p->name

  • 指针变量->成员名 :结构体变量中成员的值

  • 指针变量->成员名++:结构体变量中成员的值,使用后再加1

  • ++指针变量->成员名:结构体变量中成员的值加1,计算后再进行使用

  • 指向结构体数组的结构体指针变量的值结构体数组的首地址

  • 结构体,结构体指针,结构体成员作为函数参数
    链表

  • 添加元素时,存储的个数会随之改变,这种存储方式就是链表

  • 链表中有一个头指针,指向一个变量,这个变量称为元素。链表中每个元素都包含数据部分和指针部分,数据部分存放元素包含的数据,指针部分指向下一个元素,最后一个元素的指针指向NULL.

  • 动态分配空间的函数

  • malloc:在内存中动态分配一块size大小的内存空间 ,返回一个指针,该指针指向分配的内存空间,若出错,返回NULL
    void *malloc(unsigned int size)

  • calloc:在内存中动态分配n个长度为size的连续内存空间,返回一个指针,该指针指向动态分配的连续内存的首地址,若出错,返回NULL
    void *(unsigned n,unsigned size)

  • free函数:释放指针指向的内存区,使该部分内存能被其他变量使用。无返回值
    void *free(void *ptr) ptr为最近一次调用calloc malloc返回的指针
    共用体

  • 使集中不同类型的变量存放在同一个内存单元中,在某一时刻只能有一个值,共同体的大小等于最大成员的大小

  • 定义: union 共同体名

  •       {
    
  •        成员列表
    
  •        } 变量列表
    
  • 引用方式:共同体变量.成员名,不能在输出语句中直接引用共用体变量。如 printf(“%d”,共同体变量)

  • 共同体变量初始化:只需要初始化一个值即可,类型必须和共同体第一个成员类型一致。

  • 共同体类型的特点
    同一内存虽然可用来存放不同类型的成员,但每次只能存放一种类型,而不能同时存放所有类型,即,共同体中只有一个成员能起作用,其他成员不起作用。
    共同体变量中,起作用的永远是最后存放的成员,存入新成员后,原有的成员将失去作用
    共同体变量的地址和它的各成员地址是一样的
    不能对共同体变量名赋值,页不能企图引用变量名来得到一个值

位段

  • 一种特殊的结构体类型,所有成员的长度均以二进制为单位进行定义,结构体中的成员称为段位。每个段位必须是int 、unsigned或signed中的一种。

  • 定义:
    struct 结构体名
    {
    类型 变量名:长度;

    }
    预处理

  • 包含宏定义,条件编译。

  • 宏定义:预处理命令的一种,提供一种可以替换源代码中字符串的机制。宏定义指令#define用来定义一个标识符和一个字符串,以这个标识符代替这个字符串,相当于给指定字符串起了一个别名

  • 作用范围:#define出现的位置到所在源文件的结束,或到响应的#undef预处理指令处。 可以定义在函数内。

  • 不带参数的宏定义:#define 宏名 字符串 如 #define PI 3.1415
    字符串中出现红名,则不进行替换
    字符串超过一行,行末用反斜杠“\”进行续行
    #define命令出现函数外时,宏名的有效范围为定义命令之后到此源文件结束
    #undef命令终止宏定义作用域
    宏定义是一种预处理命令,不同于变量定义,只能做字符替换,不能分配内存空间

  • 带参数的宏定义 不仅要进行字符串的替换,还要进行参数的替换
    #define 宏名((a),(b)) 字符串
    宏替换代替实在的函数,提高代码速度(不存在函数调用),代价是由于重复编码,增加程序的长度
    宏定义时,参数要加括号,若不加括号,结果可能错误因为参数可能是表达式
    对带参数的宏的展开,只是用宏名后括号内的实参字符串代替#define命令中的形参
    宏定义时,宏名和带参数的括号之间不能加空格,否则会将空格以后的字符都作为替换字符串的一部分
    在带参宏定义中,形式参数不分配内存单元,因此不必做类型定义
    #include命令

  • 使用#include命令可将其他源文件的内容包含进来,即将其他文件包含到本文件之中。被读入的源文件必须用索引号或尖括号括起来。
    #include “stdio.h” :系统先在用户当前目录中寻找要包含的文件,若找不到,再到存放C库函数头文件所在的目录中寻找要包含的文件
    #include <stdio.h>:标准形式,系统会直接到存放C库函数头文件所在的目录中寻找要包含的文件。
    通常情况下:包含库函数,使用尖括号节省查找时间,包含用户自定义文件时,使用双引号比较快捷。用户自己编写的文件通常保存在当前目录中,若文件不在当前目录中,双引号还可以给出文件路径
    将恩建直接嵌入#include命令内也是可行的。这种方式称为嵌套的嵌入文件

  • 经常用在文件头部的被包含文件称为标题文件或头文件,一般以.h结尾。包含内容
    宏定义
    结构,联合,枚举的声明
    typedef声明
    外部函数声明
    全局变量声明

  • 文件包含:
    为程序修改提供方便
    一个#include命令只能指定一个被包含的文件
    文件包含可以嵌套的,一个被包含文件中还可以包含另一个被包含文件
    若age.c中包含文件age.h,则编译后两者会成为一个文件。如age.h中有全部静态变量,该全部变量在age.c中有效,这时不需要使用extern声明
    条件编译

  • #if命令 常数表达式 (判断表达式的真假)
    语句段
    #elif
    语句段
    #else
    语句段
    #endif

  • #ifdef 宏替换名 (如有定义)

  •      语句
    
  • #else

  •  语句
    
  • #endif

  • #ifndef 宏替换名 (如未定义)

  •      语句
    
  • #else

  •  语句
    
  • #endif

  • #undef 命令:删除事先定义好的宏定义,可将宏名限制在特定的代码段中
    #undef 宏替换名,

  • #line命令:显示当前编译行的行号(LINE),当前编译文件名号(FILE
    #line 行号[“文件名”]
    如: #line 100"137.c"

  • #pragma命令:用于设定编译器状态,或指示编译器完成一些特定动作
    #pragma 参数
    messag参数:在编译信息窗口中输出的相应信息
    code_seg参数:设置程序中函数代码存放的代码段
    once参数:保证头文件被编译一次

文件

  • 文件结构体有系统定义 FILE

  • 定义文件指针:FILE *P 不能通过定义文件变量来操作文件,File型数据对象的位置由库函数确定,C语言只能通过FILE类型的指针来操作文件

  • 打开文件:FILE *fp fp= fopen(文件名,使用文件方式)成功返回FILE类型指针,失败返回NULL

  • 文件关闭:fclose(文件指针) 成功返回0,失败返回eof

  • 程序关闭之前应关闭所有文件,目的是防止因为没有关闭文件而造成数据丢失

  • fputc(ch,fp): ch(一个常量或变量),fp(文件指针变量) 把一个字符写到磁盘文件(fp所指向的文件),成功返回写入的字符,失败返回EOF

  • ch=fgetc(fp):从指定的文件读取一个字符赋予ch

  • 文件以读或读写的方式打开,当遇到文件结束时,返回文件结束标志EOF

  • fputs(字符串,文件指针):向指定的文件写入一个字符串。字符串:字符串常量,字符数组名,指针,变量

  • fgets(字符串,n,文件指针):从指定的文件中读取一个字符串到字符数组中。n表示读取的字符串中字符的个数(包含“\0”)

  • fprintf(文件类型指针,格式字符串,输出列表):格式化输出到磁盘文件

  • fscanf(文件类型指针,格式字符串,输入列表): 格式化读取磁盘文件

  • fread(buffer,size,count,fp):从fp指向的文件读取count次,每次读size字节,读取的信息保存在buffer地址中。

  • fwrite(buffer,size,count,fp):将buffer地址开始的信息输出count次,每次写size字节到fp指向的文件中。buffer,一个指针

  • 文件的定位:
    fseek(文件类型指针,位移量,起始点):移动文件内部的位置指针,一般用于二进制文件,在文本文件使用时,需要进行转换,计算的位置会出现错误。
    文件类型指针:被移动的文件
    位移量:移动的字节数,一般为long型数据,以保证文件长度大于64KB不会出错,
    起始点:从何处开始计算位移量,一般是文件首,文件当前位置和文件尾
    文件首:表示符号:seek-set ;数字表示:0
    文件当前位置:seec-cur ;数字表示:1
    文件尾:seek-end;数字表示:2

  • rewind函数:将位置指针重返文件开头,没有返回值 形式:int rewind(文件类型指针)

  • ftell函数:得到流式文件中的当前位置,使用相对于文件头的位移量表示。 形式:long ftell(文件指针类型), 返回-1L,表示出错
    存储管理

  • 计算机程序一般被组织成4个逻辑段:可执行代码,静态数据,动态数据(堆)和栈

  • 可执行代码和静态数据存储在固定的内存位置

  • 动态数据需要系统动态分配内存,一般存放在堆区的内存池中

  • 局部数据对象,函数参数,以及调用函数和被调用函数的关系,存在在栈区的内存池中。

  • 堆:内存的全局存储空间中,程序可以动态分配和释放的内存块称为自由存储空间,也称为堆

  • C程序中,用malloc 和free函数从堆中动态地分配和释放内存

  • malloc( size):在内存中动态分配一块size大小的内存空间

  • calloc(n,size):动态分配n个长度为size的连续内存空间

  • realloc(*ptr,size):将ptr指针指向的内存空间的大小改为size

  • free(*ptr):释放指针ptr指向的内存区域。若不释放,会造成内存泄漏

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值