【C语言复习笔记】一些要点

按学校教材复习的,整理的是我不熟悉的地方

最近C用的好少,快忘完了就赶紧整理一下(Python真好玩)

第一章 初识C语言

存储器

内存容量的大小,取决于地址总线的数量

\(1B=8bits\)

\(1KB=2^{10}B\)

往后,依次MB, GB, TB, PB, EB, ZB, YB,均为\(2^{10}\)递增

计算机程序与计算机语言

  • 开发C程序的完整过程:

· 编辑(生成拓展名为.c的源文件)

· 编译(生成拓展名为.obj的目标文件)

· 链接(生成拓展名为.exe的可执行文件)

· 运行

  • 第一个结构化程序设计语言:PASCAL

第二章 数据类型

C源程序的组成

函数是C语言源程序的基本单位

一个函数的完整定义由函数首部函数体两部分构成

常量

整型常量

八进制:数字0开头

十六进制:0X或0x开头

实型常量

表示方式:小数形式、指数形式

如:3.14; 3.9e8; 6.8E-5; 9.0e+20等

实型常量默认double类型

字符常量

表示方式:一堆单引号将一个字符括起来;单引号括起的以‘\’开头的字符序列

ASCII码表中,字符分为可打印字符控制字符

特殊的转义字符:

'\ddd':1到3位八进制ASCII码值所代表的字符

\xhh’:1到2位十六进制ASCII码值所代表的字符

ASCII码表中字符:

Space-32

A-65

a-97

小写->大写:-32

字符串常量

双引号括起来的零个或多个字符序列,后面有系统添加的\0

  • 字符串常量的实际字符数总是比其双引号中的字符数多1

符号常量

用#define宏定义的东西

变量

scanf用法

%5d:限制阈宽为5

  • 注意:scanf没有%5.2d这种用法

print用法

例:

  • printf("%5d",1234567) 输出:1234567

  • printf("%5.2d",123.1254) 输出: 123.13

  • char - 1 Byte

  • int - 4 Byte

  • double - 8 Byte

  • 冯·诺伊曼提出了程序存储的思想

  • 计算机五大基本组成部件:

运算器,控制器,存储器,输入设备,输出设备。

第三章 运算符

一些运算符优先级

  • ! : 2
  • && : 11
  • || : 12
  • ==, != : 7

注意前++与后++

数据类型转换

  • 赋值中自动类型转换:将右边表达式的值转成左边变量的类型
  • 强制类型转换:如 (int)a

1.sizeof是一个运算符,不是一个函数。

第四章 程序流程

注意switch有一个掉落原则,只要碰到符合的case,若case后没有break就会一直执行。

如:写出下面程序的运行结果 (Hello, World!)

#include <stdio.h>
int main()
{
int x=1,y=1,z=1;
switch(x)
{
case 1:
switch(y)
{
case 0:printf("Hi");
case 1:printf("Hell");break;
case 2:printf("o");
}
case 0:
switch(z)
{
case 0:printf("wor");break;
case 1:printf("o, Wo");
case 2:printf("rld");
}
default: printf("!");
}
return 114514;
}

下面是一些经典程序:

打印倒三角:

int i, j;
for(i = 0; i < 5; i++)
{
for(j = 0; j < i; j++)
printf(" ");
for(j = 9 - 2 * i; j > 0; j--)
{
printf("*");
}
printf("\n");
}

打印九九乘法表:

#include <stdio.h>

int main(void)
{
int i,j,k;
for(i=1; i<=9; i++)
{
for(j=1; j<=i; j++)
{
printf("%d*%d=%d\t", j, i, i*j);
}
printf("\n");
}
return 0;
}

1.下面程序的运算结果是 (4,4)

  int a,b=0;
for(a=0; a++<=2;);
b+=a;
printf("%d,%d",a,b);

第五章 函数

函数调用的完整过程:

  • 转向
  • 传参
  • 执行
  • 返回
  • 继续

变量作用域

定义在函数内部:局部变量;外部:全局变量

变量存储类型

全局变量:生命周期为整个运行期间,static类型仅限本文件使用,非static的加上extern声明后其他文件可以使用

静态局部变量的生命周期等于全局变量,作用域等同于自动局部变量

常见题

判断质数

int judgePrime(int n)//不属于正整数返回-1,不是质数返回0,是质数返回1
{
int i,k,judge=1;
if(n<=0) return -1;
if(n==1) return 0;
if(n==2||n==3) return 1;
k=(int)sqrt(n);
for(i=2;judge&&i<=k;i++)
judge=n%i;
return judge;
}

求最大公因数(递归)

int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}

1.‎若函数定义时不指明函数类型,则其默认的返回值类型是int

第六章 数组

没啥东西,熟悉常用算法即可

下面是一些常见算法

输出数组

int Array_print(int * a, int n) //n:numbers
{
int * p = a; //工作指针p
while(p - a < n) //扫描数组
printf("%d ", *p++);
printf("\n");
return 1;
}

插入数组元素

int Array_insert(int * a, int n, int m, int x)//在下标m后插入一个数组元素x; n:numbers
{
int i=n-1;
while(i>m) //移位
a[i--]=a[i-1];
a[m+1] = x; //插入
return 1;
}

删除类似插入,不细嗦了。

寻找最值

int Array_findMinandMax(int * array, int n, int mode)//n:numbers; mode: 0-min;1-max
{
int * a = array; //工作指针a
int max = *a, min = *a;
while(a - arr < n) //扫描数组
{
if(*a > max) max = *a;
if(*a < min) min = *a;
a++;
}
switch(mode)
{
case 0: return min;
case 1: return max;
default: return 114514;
}
}

排序

传统冒泡排序

int * Array_bubbleSorting(int * a, int n, int mode)
{
int i,j,temp;
int * p = a; //输出的数组p
if(mode == 0) //正序
{
for(j = 0; j<n-1; j++) //共n-1趟冒泡
for(i = 0; i<n-1; i++) //每一趟冒泡
{
if(p[i] > p[i+1])
{
temp = p[i];
p[i] = p[i+1];
p[i+1] = temp; //前一个大就值交换
}
}
}
if(mode == 1) //逆序
{
for(j = 0; j<n-1; j++) //共n-1趟冒泡
for(i = 0; i<n-1; i++) //每一趟冒泡
{
if(p[i] < p[i+1])
{
temp = p[i];
p[i] = p[i+1];
p[i+1] = temp; //前一个小就值交换
}
}
}
return p;
}

选择法排序

int * Array_chooseSorting(int * a, int n, int mode)//n:numbers; mode:0-正序, 1-逆序
{
int * p = a;//输出的数组p
int i,j,temp,index;
if(mode == 0)//正序
{
for(i=1; i<n; i++)//共进行n轮
{
index = i-1;//初始化index,假设p[i-1]为最小
for(j=i; j<n; j++)//每一轮选出该轮最小值对应下标给index
{
if(p[j] < p[index])
index = j;
}
temp = p[index]; //交换
p[index] = p[i-1];
p[i-1] = temp;
}
}
if(mode == 1)//逆序
{
for(i=1; i<n; i++)//共进行n轮
{
index = i-1;//初始化index,假设p[i-1]为最大
for(j=i; j<n; j++)//每一轮选出该轮最大值对应下标给index
{
if(p[j] > p[index])
index = j;
}
temp = p[index]; //交换
p[index] = p[i-1];
p[i-1] = temp;
}
}
return p;
}

1.getchar()会读取回车符

int a[][4] = {0};//这种赋值将所有赋值为0,是正确的用法。

第七章 指针

C语言精华所在。

上面的数组里已经用了不少指针了。

  1. int a[10]; sizeof(a)出来是40

第八章 字符串

没啥,跟数组差不多。

一些string.h中的库函数:

  • int strlen(const char * str);
  • char * strcpy(char * destination, const char * source);
  • char * strcat(char * destination, const char * source);
  • int strcmp(const char * s1, const char * s2); //前大返回1,后大返回-1
  • char * strupr(char * str);
  • char * strlwr(char * str);

1.下列代码输出结果为() (123)

#include <stdio.h>
int main()
{
char * str = "123\0abdc";
printf("%s",str);
return 114514;
}

可以发现,C在输出字符串时,只要碰到\0就会停止输出,不管\0后面是啥。

2.下面的字符串初始化是错的:

char str[5]="good!";//应该把5改为6

因为 “good!” 需要的存放空间为5+1=6,多出来的1是留给\0。

3.‎strlen("b\013c\xac\\abc\n")的值为() (9)

​ 因为代码中字符串包含 ’b’, ’\013’, ’\c’, ’\xac’, ’\\’, 'a' ’b’, ’c’, '\n' 共9个有效字符

4.下面程序的输出结果是() (W, )

  char str1[6] = "Hello";
char str2[13] = "12345,World!";
strcpy(str2,str1);
printf("%c,%c",str2[6],str2[5]);

5.下面程序的输出结果是() (Hello)

  char str1[6] = "Hello";
char str2[13] = "12345,World!";
strcpy(str2,str1);
puts(str2);

​ 综合4,5可见strcpy的操作逻辑。

第九章 编译预处理与多文件

编译预处理指令都以#开头

宏定义

分为无参宏和带参宏

带参宏:()中为参数列表

1.宏定义将一个标识符定义为一个字符串,不进行数据类型的处理。

2.对于以下宏定义:

‍ #define M(x) x*x

‍ #define N(x, y) M(x)+M(y)

执行语句z=N(2, 2+3);后,z的值是() (15)

‍(宏定义经典题目)

第十章 结构体

EZ~

第十一章 文件

(因为当时没听课所以就多写了一些()

C语言中文件分为两种:文本文件(ASCII文件)二进制文件

对文件进行操作,首先要定义1个文件指针。

打开文本文件方式(二进制+b):

  • r:输入方式打开
  • w:输出方式打开
  • a:输出追加方式打开
  • r+:读/写方式打开
  • w+:读/写方式建立
  • a+:读/写追加方式打开

相关库函数:

  • FILE * fopen(char * filename, char * mode); // 打开文件
  • int fclose(FILE * fp); // 关闭文件
  • int fputc(int c, FILE * fp); // 将字符写入文件
  • int fgetc(FILE * fp); // 从文件读出一个字符,位置指针自动后移一个字符
  • int feof(FILE * fp); // 位置指针指向文件末尾返回非0,其余0。位置指针同时后移
  • int fputs(const char * s, FILE * fp); // 将字符串写入文件
  • char * fgets(char * s, int n, FILE * fp); // 从文件读取字符串
  • int fprintf(FILE * fp, const char * format, ...); // 格式化写入
  • int fscanf(FILE * fp, const char * format, ...); // 格式化读取
  • int fwrite(const void * buffer, int size, int n, FILE * fp); // 块数据写入
  • int fread(void * buffer, int size, int n, FILE * fp); // 块数据读取
  • ......(后面不考所以不写啦)

读取旧文件控制循环:

/*用feof函数读取*/
ch = fget(fp);
while(!feof(fp))
{
putchar(ch);
ch = fgetc(fp);
} /*标准读取*/
while((ch = fgetc(fp)) != EOF)
{
putchar(ch);
}

【C语言复习笔记】一些要点的更多相关文章

  1. C语言复习笔记-17种小算法-解决实际问题

    判断日期为一年中的第几天(考虑闰年) 1 /* 2 * 计算该日在本年中是第几天,注意闰年问题 3 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 4 * 特殊情况,闰年且 ...

  2. [转贴]C语言复习笔记-17种小算法-解决实际问题

    判断日期为一年中的第几天(考虑闰年) /* * 计算该日在本年中是第几天,注意闰年问题 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 * 特殊情况,闰年且输入月份大于3时 ...

  3. 【C/C++】C语言复习笔记-17种小算法-解决实际问题

    判断日期为一年中的第几天(考虑闰年) /* * 计算该日在本年中是第几天,注意闰年问题 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 * 特殊情况,闰年且输入月份大于3时 ...

  4. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  5. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  6. angular复习笔记4-模板

    Angular复习笔记4-模板 简介 模板是一种自定义的标准化页面,通过模板和模板中的数据结合,可以生成各种各样的网页.在Angular中,模板的默认语言是HTML,几乎所有的HTML语法在模板中都是 ...

  7. JavaScript 语言精粹笔记3

    方法 毒瘤 糟粕 记录一下阅读蝴蝶书的笔记,本篇为书中最后一部分:方法.代码风格.优美的特性.毒瘤.糟粕等. 方法 这一章主要介绍了一些方法集.这里写几个我不太熟悉的方法和要点吧. array.joi ...

  8. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  9. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  10. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

随机推荐

  1. Java 数字 默认是 Integer类型的问题,System.currentTimeMillis() + (180 * 24 * 60 * 60 * 1000)的问题,剖析、Long + Integer的问题

    最终结论: (180 * 24 * 60 * 60) 这种计算表达式在 Java中是默认以 Integer类型来的,若不超过 Integer的最大值则没有问题,若超过则必须用 (180 * 24 * ...

  2. Linux-cp命令常用选项

    cp 命令是 Linux 中一个重要的命令,你可能经常会用到它.正如名称所示,cp 代表 复制(copy),它被用于在 Linux 命令行中复制文件和目录. 语法格式 mv [选项] 源文件或目录 目 ...

  3. Apache HTTP Server、IIS反向代理设置

    Apache HTTP Server 在 Apache 中设置反向代理,需要使用 mod_proxy 和相关的模块,如 mod_proxy_http.以下是一个基本的配置示例: 确保已经安装并启用了  ...

  4. STC系列8位MCU在Windows下的开发

    STC系列 MCS-51 8位MCU 简介 STC的8位MCU有89/90/10/11/12/15/8(A/F/G/H)这几个大系列, 都是8051衍生的8位单片机, 每个系列的特点如下 STC89系 ...

  5. Spring Boot图书管理系统项目实战-6.图书管理

    导航: pre:  5.读者管理 next:7.借阅图书 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 book.html ...

  6. macOS使用CodeRunner快速配置fortran环境

    个人网站:xzajyjs.cn 由于一些项目的缘故,需要有fortran的需求,但由于是M1 mac的缘故,不能像windows那样直接使用vs+ivf这种经典配置.搜了一下网上主流的跨平台方案,主要 ...

  7. toml格式配置文件介绍

    toml官方wik toml官方文档 此次文档是以v1.0.0为例,进行说明的.如果使用到的版本不同,直接去官方文档中找对应的版本即可. 谈到配置文件,大家都能说出来好几种,比如常见的ini.xml. ...

  8. 大众点评-CAT监控平台

    前言 我们禀着发现问题,解决问题的方针,针对后台诸多的服务,如何实时监控接口性能和访问频率,还要统计大盘信息?CAT作为大众点评开源的系统监控平台项目,下面就介绍一下CAT平台的搭建步骤. CAT作为 ...

  9. [App Service for Windows]通过 KUDU 查看 Tomcat 配置信息

    问题描述 在App Service 中选择了Java Tomcat后,如何查看Azure App Service的Tomcat的配置信息呢? 问题解答 可以通过以下的 3个步骤查看: 第一步:登录 K ...

  10. Hugo 建站经验之谈

    前言 建站工具,早已不是一个新颖的话题,抛开可视化建站单论开发层面,各类语言都有推出广受欢迎的建站框架,比如 Python 开发的 Pelican,JavaScript 开发的 Hexo,以及市场份额 ...