【C语言复习笔记】一些要点
【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语言精华所在。
上面的数组里已经用了不少指针了。
注
- 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语言复习笔记】一些要点的更多相关文章
- C语言复习笔记-17种小算法-解决实际问题
判断日期为一年中的第几天(考虑闰年) 1 /* 2 * 计算该日在本年中是第几天,注意闰年问题 3 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 4 * 特殊情况,闰年且 ...
- [转贴]C语言复习笔记-17种小算法-解决实际问题
判断日期为一年中的第几天(考虑闰年) /* * 计算该日在本年中是第几天,注意闰年问题 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 * 特殊情况,闰年且输入月份大于3时 ...
- 【C/C++】C语言复习笔记-17种小算法-解决实际问题
判断日期为一年中的第几天(考虑闰年) /* * 计算该日在本年中是第几天,注意闰年问题 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 * 特殊情况,闰年且输入月份大于3时 ...
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- angular复习笔记4-模板
Angular复习笔记4-模板 简介 模板是一种自定义的标准化页面,通过模板和模板中的数据结合,可以生成各种各样的网页.在Angular中,模板的默认语言是HTML,几乎所有的HTML语法在模板中都是 ...
- JavaScript 语言精粹笔记3
方法 毒瘤 糟粕 记录一下阅读蝴蝶书的笔记,本篇为书中最后一部分:方法.代码风格.优美的特性.毒瘤.糟粕等. 方法 这一章主要介绍了一些方法集.这里写几个我不太熟悉的方法和要点吧. array.joi ...
- HTML语言学习笔记(会更新)
# HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
随机推荐
- Linux的yum源配置总结
本文总结归纳了一系列Linux系统的各种yum配置,虽然不一定是标准配置,但都是自己曾真实测过可用的. 1.RHEL6 本地 yum源配置 2.CentOS6 本地 yum源配置 3.OEL5 本地 ...
- 17.2 内存映射文件的一致性--《Windows核心编程》
系统允许我们把同一个文件映射到多个视图中,只要映射的是同一个文件映射对象,系统会保证各视图中数据是一致的.例如一个程序修改了一个视图内的内容,那么系统会更新所有其他视图(对应同一文件映射对象)中的内容 ...
- RabbitMQ 使用细节 → 优先级队列与ACK超时
开心一刻 今天坐在太阳下刷着手机 老妈走过来问我:这么好的天气,怎么没出去玩 我:我要是有钱,你都看不见我的影子 老妈:你就不知道带个碗,别要边玩? 我:...... 优先级队列 说到队列,相信大家一 ...
- CF1823D Unique Palindromes
题目链接 题解 知识点:构造. 首先反证法容易证明一个结论:每次增加一个字符,本质不同的回文子串至多增加一个. 那么无解的条件就是,\(c_i - c_{i-1} > x_i -x_{i-1}\ ...
- NC23501 小A的回文串
题目链接 题目 题目描述 小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的.所以小A只想知道给定的一个字符串的最大回文子串是多少,但是小A对这个结果并不是非常满意.现在小A可以对这个字符串 ...
- NAND Flash 寿命算法——Wear leveling
由于闪存的可擦写次数是有限的,当某些数据被频繁修改时容易导致对应的块很快被耗尽使用寿命,从而导致整块盘无法使用,所以需要有一种技术来将这些块的擦写均摊一下,延长使用寿命. 首先看几个相关的基本概念: ...
- OGP协议的使用
OGP协议是一套Metatags的规格,用来标注页面,告诉我们你的网页快照.帮助社交app高效并准确的获取网页中的核心链接.标题.主图.正文摘要等信息,使得该网页在社交分享中有更好的展现体验. 如果网 ...
- 如何设置mysql root密码
如何设置mysql root密码: 1.首次安装 root初始密码为空,注意就是没有密码,直接敲回车即可进入 D:\wamp\bin\mysql\mysql5.6.17\bin> mysql - ...
- RHEL8重置root用户密码步骤
要先确定是否为RHEL 8系统. [root@zhangsan ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 8.0 (Oo ...
- 矩池云教程|体验 OpenAI 最近推出的 3D 生成模型 Shap-E!
Shap-E 是由 OpenAI 最近推出的3D生成模型,使用者可以通过简单的文字或图像进行三维模型的生成,OpenAI 认为相比于点云的生成模型Point-E,Shap-E的收敛更快.本文将展示如何 ...