C语言程序设计的板块补充

  • 变量的存储类别
    • 存储类别小结图
    • 作用域角度
  • 预处理命令
    • 宏定义和调用(带参数的宏,不带参数的宏)
      • 无参
      • 带参
    • “文件包含” 处理
  • 结构体
    • 结构体类型的声明定义及引用
      • 结构体类型的声明
      • 结构体类型的定义初始化及引用
      • 定义初始化及引用举例
      • 结构体变量和指向结构体的指针作函数参数
  • 共用体
    • 共用体类型的声明定义及引用
      • 共用体类型的声明
      • 结构体类型的定义初始化及引用
      • 占内存大小
      • 共用体与指针,共用体参与传参
  • 枚举
  • 动态内存分配【重点难点】
    • 传统数组的缺点:
    • 动态分配内存的举例----动态数组的构造
      • malloc函数的使用简单介绍
      • 动态数组的构造
    • 静态内存和动态内存
      • 静态内存
      • 动态内存
  • 指针与链表
  • 位运算
  • 文件
    • 文件类型指针
    • 文件的打开与关闭
      • 文件的打开
      • 文件的关闭
    • 文件的读写
      • fputc函数和fgets函数(puts函数和gets函数)
      • fread 函数和fwrite 函数
      • fprintf函数和fscanf函数
      • 其他读写函数
    • 文件的定位
      • rewind函数
      • fseek函数和随机读写

变量的存储类别

存储类别小结图

作用域角度

全局变量
在所有函数外部定义的变量叫全局变量
全局变量的使用范围:从定义位置开始到整个程序结束
局部变量
在一个函数内部定义的变量或者函数的形参 都称为局部变量

void  f(int i)
{int j=20;}

i和j都属于局部变量
局部变量使用范围:只能在本函数内部使用
注意的问题
全局变量和局部变量命名冲突的问题,在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用

预处理命令

宏定义和调用(带参数的宏,不带参数的宏)

# define 标识符 字符串# define 宏名 宏体
特点:源位置替换,一改全改,可嵌套定义

无参

# include <stdio.h># define PI 3.14
# define  M  2+3
void main()
{int r = 1;2 * PI * r;PI  * r * r;printf("%d\n",M*M);//结果显示11}
# include <stdio.h># define PI 3.14
# define  M  (2+3)
void main()
{int r = 1;2 * PI * r;PI  * r * r;printf("%d\n",M*M);//结果显示25}

带参

# include <stdio.h># define MAX(a,b)     ((a) > (b)? (a):(b))
void main()
{int i = 3,j = 5;printf("%d\n",MAX(i,j));}

“文件包含” 处理

# include <stdio.h>目的引用头文件的标准输入输出函数
预处理:处理程序中所有以# 开头的行,如# include ,# define, # if ,#else ,#ifdef ,# ifndef

结构体

为了表示一些复杂的事物,而基本的数据类型无法满足实际要求,把一些基本的数据类型组合在一起形成一个新的复杂的数据类型

结构体类型的声明定义及引用

结构体类型的声明

struct 结构体名
{
数据类型1,成员名1;
数据类型2,成员名2;
……
};

结构体类型的定义初始化及引用

//无头,无头结构体必须在结构体成员描述后将变量一次性定义好
//有头不作要求
3种方式,推荐使用第一种方式
//第一种方式
struct 结构体名
{
成员名表列
};

//第二种方式

struct 结构体名
{
成员名表列
}变量名表列;

//第三种方式

struct
{
成员名表列
}变量名表列;

定义初始化及引用举例

# include <stdio.h>struct student{int age;float score;char sex;};void main(){struct student st={80,66.6,'F'};//定义的同时赋值初始化struct student st2;//先定义,然后引用变量名.成员名st2.age = 80;st2.score = 88;st2.sex = 'A';/*struct student *pst = &st;//指针变量名->成员名pst->age=80;*/printf("%d %f %c\n",st.age,st.score,st.sex);printf("%d %f %c\n",st2.age,st2.score,st2.sex);}

*指针变量名->成员名,在计算机内部转化为(指针变量名).成员名的方式来执行,所以说这两种方式是等价的

结构体变量和指向结构体的指针作函数参数

# include <stdio.h>
# include <string.h>struct student
{int age;char name [100];char sex;
};Inputstudent (struct student * pst);
Outputstudent (struct student * pst);
void main()
{struct student st;Inputstudent (&st);//对结构体变量输入,必须发送st的地址Outputstudent(&st);//对结构体变量输出,可以发送st的地址也可以发送st的内容,为了减少内存消耗,推荐使用地址发送}Inputstudent (struct student * pst)
{(*pst).age = 10;strcpy(pst->name,"张三");pst->sex = 'F';}Outputstudent (struct student * pst)
{printf("%d %s %c",pst->age,pst->name,pst->sex);
}

共用体

共用体类型的声明定义及引用

共用体类型的声明

union 共用体名
{
数据类型1,成员名1;
数据类型2,成员名2;
……
};

结构体类型的定义初始化及引用

//无头,无头结构体必须在结构体成员描述后将变量一次性定义好
通过变量名:不能一次性引用到所有的成员,引用方式:变量名.成员名或指针->成员名

占内存大小

所有成员共用同一块空间,同一个时刻只有一个成员生效,共用体大小由成员中中占位最大的成员决定

共用体与指针,共用体参与传参

枚举

枚举的定义:把一件事物所有可能的值一一列举出来
枚举的应用

# include<stdio.h>enum weekday
{MonDay, TuesDay, Wednesday, ThursDay, FriDay, SaturDay, SunDay//不作说明,本质上是0——6的数字,但实际不能这样写
};void f(enum weekday i)//本函数的目的是期望接收0——6的数字,将形参i定义为枚举类型
{switch (i){case 0:printf("MonDay!\n");break;case 1:printf("TuesDay!\n");break;case 3:printf("WednesDay!\n");break;case 4:printf("ThursDay!\n");break;case 5:printf("FriDay!\n");break;case 6:printf("SaturDay!\n");break;case 7:printf("SunDay!\n");break;}
}
int main(void)//实质上是0——6,但是不能输入,只能输入FriDay
{f(FriDay);return 0;
}

动态内存分配【重点难点】

传统数组的缺点:

1.数组长度必须事先制定,且只能是常数,不能是变量。例子: int a[5];//OK int len = 5; int a[len]//eror
2.传统形式定义的数组,该数组的内存程序员无法手动释放在一个函数运行期间,系统为该函数中数组中所分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放
3.数组的长度一旦定义,其长度就不能在更改;
数组的长度不能在函数运行的过程中动态的扩充或缩小
4.A函数定义的数组,在A函数运行期间可以被其他函数使用,但A函数运行完毕之后,A函数中的数组将无法在被其他函数使用

动态分配内存的举例----动态数组的构造

malloc函数的使用简单介绍

# include <stdio.h>
# include <malloc.h>int main(void)
{int i = 5;//分配了4个字节,静态分配int * p = (int *)malloc(4);//11行/*1.要使用malloc函数,必须添加malloc.h这个文件2.malloc函数只有一个形参,并且形参是整型3.4表示请求系统为本程序分配4个字节4.malloc函数只能返回第一个字节的地址5.12行分配了8个字节,p变量占个字节,p所指向的内存也占4个字节6.p本身所占的内存是静态分配的,p所指向的内存是动态分配*/*p = 5;//* p代表的就是一个int变量,只不过* p这个整形变量的内存分配方式和11行的内存分配方式不同free(p);//free(p)表示把p所指向的内存给释放掉,p本身的内存是静态的,不能右程序员手动释放,p本身的内存只能在变量所在的函数                       运行终止时由系统自动释放的printf("同志们好!\n");return 0;
}
# include<stdio.h>
# include<malloc.h>void f(int * q)
{* q = 200;
}
int main()
{int * p = (int *)malloc(sizeof(int));*p = 10;printf("%d\n",*p);f(p);printf("%d\n",*p);
}

动态数组的构造

# include<stdio.h>
# include<malloc.h>void main()
{int len;
int * pArr;
int i;
//动态的构造一维数组
printf("请输入你要存放的元素的个数");
scanf("%d", &len);
pArr = (int *)malloc(4 * len);//本行动态的构造了一个一维数组,该一维数组的长度是len, 该数组名是pArr,数组元素类型是int 。类似于int pArr[i];//对一维数组进行操作,如,对动态一维数组进行赋值
for(i=0;i<len;i++)
scanf("%d",&pArr[i]);//对位一维数组进行输出
printf("一维数组的内容是\n");
for(i=0;i<len;i++)
printf("%d\n",pArr[i]);free(pArr);//释放掉动态分配的数组
return 0;
}

静态内存和动态内存

静态内存

静态内存不能跨函数使用,由系统自动分配,自动释放,在栈中分配

# include<stdio.h>void f(int ** q)//q是个指针变量,无论q是什么类型的指针变量,都只占4个字节
{int i = 5;//*q等价于p,q和**q都不等价于p//*q = i;//error 因为*q等价于p=i;这样写是错误的*q=&i;//p=&i;
}
void main()
{int *p;f(&p);printf("%d\n",*p);//本句语句语法没有问题,但逻辑上有问题return 0;
}

动态内存

动态内存能跨函数使用,可由程序员分配,手动释放,在堆中分配

# include<stdio.h>void f(int ** q)
{*q = (int *)malloc(sizeof(int));//sizeof(数据类型)返回值是该数据类型所占的字节//等价于 p = (int *)malloc(sizeof(int));//q=5;//error//*q=5;//p=5;//error**q=5;//*p=5;
}
void main()
{int *p;f(&p);printf("%d\n",*p);return 0;
}

指针与链表

位运算

1.&——按位与 0&0=0;0&1=0;1&0=0;1&1=1
2.|——按位或 0|0=0; 0|1=1; 1|0=1; 1|1=1
3.^——异或 0 ^0=0; 0 ^1=1; 1 ^0=0; 1 ^1=0;
4.~——取反 0变成1;1变成0
5.<<——左移运算符 (放大数据) 左移n位,放大2^n倍
6. >>——右移运算符 (缩小数据) 右移n位,缩小2^n倍

文件

意义:数据可实现永久存放I/O操作:input ,output

文件类型指针

typedef struct
{short level;/*缓冲区“满”或“空”的程度*/
unsigned flags;/*文件状态标志*/
char fd;/*文件描述符*/
unsigned char hold;/*如缓冲区不读取字符*/
short         bsize;/*缓冲区的大小*/
unsigned  char *buffer;/*数据缓冲区的位置*/
unsigned  ar   *curp;/*指针,当前的指向*/
unsigned       istemp;/*临时文件,指示器*/
short         token;/*用于有效性检查*/
}FILE;
FILE *fp;//f是一个指向FILE类型结构体变量的指针变量

文件的打开与关闭

文件的打开

FILE*fopen(const char filename;const char * mode)
filename :要打开的文件
mode:打开方式
FILE
:成功,返回非空指针;失败,返回空指针
mode 使用文件方式表

文件的关闭

int fclose (FILE*fp)
fp:成功打开文件的标识,目前要选择关闭的文件
int:0成功;1失败

# include <stdio.h>void main()
{FILE *fp;fp=fopen("myfile111.text","w");if(fp == NULL){printf("fopen()error.\n");return ;}printf("OK\n");fclose(fp);}

文件的读写

fputc函数和fgets函数(puts函数和gets函数)

fgets函数
调用形式:ch=fgets(fp); fp为文件型指针变量,ch 为字符变量
fputs函数
调用形式:fputs(ch,fp); ch是要输出的字符 , fp是文件指针变量
作用:将字符(ch的值)输出到fp所指向的文件中去 成功输出,失败输出EOF

fread 函数和fwrite 函数

fread(buffer,size,count,fp)
fwrite(buffer,size,count,fp)

buffer:是一个指针。对于fread来说,是读入数据的存放地址;对于fwrite来说,是输出数据的地址(起始地址)
size:要读写的字节数
count:要进行读写多少个sizez字节的数据项
fp:文件型指针

fprintf函数和fscanf函数

fprintf(文件指针,格式字符串,输出表列)
fscanf(文件指针,格式字符串,输入表列)

其他读写函数

1.puts和gets函数(读写一个字)
2.fputs和fgets函数(从指定文件读入一个字符串)

文件的定位

rewind函数

作用:使位置指针重新返回文件的开头,此函数没有返回值

fseek函数和随机读写

fseek(文件类型指针,位移量,起始点)

C语言程序设计————学习知识归纳总结(四)相关推荐

  1. C语言程序设计————学习知识归纳总结(一)

    C语言程序设计----学习知识归纳总结(一) 目录 一.简单叙述 二.C语言概述 2.1 简单的C语言程序介绍 2.2 运行C语言的简单步骤 三.数据类型,运算符与表达式 3.1 C语言的数据类型 3 ...

  2. C语言程序设计————学习知识归纳总结(三)

    C语言程序设计的重点 数组 一维数组的定义和引用 一维数组的程序举例 二维数组的定义和引用 二维数组的程序举例 字符数组 字符串 字符数组定义及初始化 输入输出 常用函数 字符数组的程序举例 函数 函 ...

  3. Kotlin知识归纳(四) —— 接口和类

    android Kotlin系列: Kotlin知识归纳(一) -- 基础语法 Kotlin知识归纳(二) -- 让函数更好调用 Kotlin知识归纳(三) -- 顶层成员与扩展 Kotlin知识归纳 ...

  4. C语言答案刘韶涛,C语言程序设计学习指导与上机实践

    <c语言程序设计学习指导与上机实践>: 教学目标明确,注重理论与实践的结合 教学方法灵活,培养学生自主学习的能力 教学内容**,强调计算机在各专业中的应用 教学模式完善,提供配套的教学资源 ...

  5. c语言程序设计学习中的问题与对策,C语言程序设计学习中的问题与对策.pdf

    C语言程序设计学习中的问题与对策 第 20 期 计 算 机 教 育 2010 年 10 月 25 日 Computer Education No.20 Oct.25,2010 83 文章编号:1672 ...

  6. C语言程序设计学习笔记:P1-程序设计与C语言

    本系列博客用于记录学习浙江大学翁恺老师的C语言程序设计,系列笔记链接如下: C语言程序设计学习笔记:P1-程序设计与C语言 C语言程序设计学习笔记:P2-计算 C语言程序设计学习笔记:P3-判断 C语 ...

  7. C语言程序设计学习笔记:P3-判断

    本系列博客用于记录学习浙江大学翁恺老师的C语言程序设计,系列笔记链接如下: C语言程序设计学习笔记:P1-程序设计与C语言 C语言程序设计学习笔记:P2-计算 C语言程序设计学习笔记:P3-判断 C语 ...

  8. 2018秋c语言程序设计考试答案,2018年自学考试《C语言程序设计》模拟试题【四篇】...

    [导语]"一分耕耘一分收获",十载寒窗铸直了你挺拔的身姿,丰富的知识拉远你睿智的目光,岁月的流逝反衬出你娇美的容颜,奋斗的道路上,你的身影显得无比的昂扬.你与每一个成功拥抱,你的汗 ...

  9. C语言程序设计知识必备pdf,c语言程序设计复习知识总结.pdf

    c语言程序设计复习知识总结 C 语言程序设计复习知识总结 孙亚飞 第一章软件工程概述及程序设计基础 1."冯-诺依曼"计算机 "存储程序原理" 一条计算机指令完 ...

最新文章

  1. uni-app在iOS移动端页面上下滑动关闭(页面回弹问题,非刷新)
  2. php大于等于符号怎么打出来_PHP常用的特殊运算符号(连续小于符号,三个小于符号,eot,eod,echo示例,print示例)...
  3. 关于 SAP UI5 系统测试工具 UIVeri5 的 Chromedriver 版本问题
  4. 如何选择数据结构和算法(转)
  5. MySQL☞insert value与values
  6. 区间DP--凸多边形三角剖分
  7. IE6 Hack(转载)
  8. 计算机论文的写作方法有哪些,计算机专业论文的写作方法.ppt
  9. 这款老不死的笔记本,让我涨见识了
  10. oracle 10g rac 停止,Oracle10g RAC 关闭及启动
  11. 华为存储认证怎么样?华为存储认证题库哪里有?
  12. Eclipse汉化教程
  13. 在html中怎样加表格斜线表头,如何在Word表格中插入斜线
  14. 攻防世界web做题步骤
  15. usim卡如何换nano卡_5G超级SIM卡价格正式公布,iPhone用户彻底无缘
  16. python注释可用于表明作者和版权信息_Python-注释帮助我们理解-No9
  17. qtabwidget设置表头_Qt GUI图形图像开发之QT表格控件QTableView,QTableWidget复杂表头(多行表头) 及冻结、固定特定的行的详细方法与实例...
  18. Abaqus接触分析--SurfaceBaseContact 法向切向接触行为
  19. 搭建Wordpress Mu的插件和注意事项
  20. 基于JAVA词典设计碰到的问题,Hanlp配置自定义词典遇到的问题与解决方法

热门文章

  1. 《计算几何》学习笔记
  2. 欧姆龙 PLC 程序NJ ST语言EtherCat总线控制 24个伺服轴大型程序电池生产线 包括PLC NJ-1400和威纶通触摸屏程序
  3. 【计算机网络】B类IP地址
  4. Shell脚本中cp使用*号提示No such file
  5. ncbi 关键字组合查询bioProjectID - 爬虫
  6. 可搜索加密研究进展综述与改进方案(读论文,学习笔记)
  7. 微型计算机用什么做cpu,微型计算机的主机是由CPU、( )成。
  8. 搭建私有MAVEN仓库
  9. nexus-搭建私服--踩坑记
  10. 程序员一定会有35岁危机吗?三分天注定,七分靠打拼