【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. Linux的yum源配置总结

    本文总结归纳了一系列Linux系统的各种yum配置,虽然不一定是标准配置,但都是自己曾真实测过可用的. 1.RHEL6 本地 yum源配置 2.CentOS6 本地 yum源配置 3.OEL5 本地 ...

  2. 17.2 内存映射文件的一致性--《Windows核心编程》

    系统允许我们把同一个文件映射到多个视图中,只要映射的是同一个文件映射对象,系统会保证各视图中数据是一致的.例如一个程序修改了一个视图内的内容,那么系统会更新所有其他视图(对应同一文件映射对象)中的内容 ...

  3. RabbitMQ 使用细节 → 优先级队列与ACK超时

    开心一刻 今天坐在太阳下刷着手机 老妈走过来问我:这么好的天气,怎么没出去玩 我:我要是有钱,你都看不见我的影子 老妈:你就不知道带个碗,别要边玩? 我:...... 优先级队列 说到队列,相信大家一 ...

  4. CF1823D Unique Palindromes

    题目链接 题解 知识点:构造. 首先反证法容易证明一个结论:每次增加一个字符,本质不同的回文子串至多增加一个. 那么无解的条件就是,\(c_i - c_{i-1} > x_i -x_{i-1}\ ...

  5. NC23501 小A的回文串

    题目链接 题目 题目描述 小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的.所以小A只想知道给定的一个字符串的最大回文子串是多少,但是小A对这个结果并不是非常满意.现在小A可以对这个字符串 ...

  6. NAND Flash 寿命算法——Wear leveling

    由于闪存的可擦写次数是有限的,当某些数据被频繁修改时容易导致对应的块很快被耗尽使用寿命,从而导致整块盘无法使用,所以需要有一种技术来将这些块的擦写均摊一下,延长使用寿命. 首先看几个相关的基本概念: ...

  7. OGP协议的使用

    OGP协议是一套Metatags的规格,用来标注页面,告诉我们你的网页快照.帮助社交app高效并准确的获取网页中的核心链接.标题.主图.正文摘要等信息,使得该网页在社交分享中有更好的展现体验. 如果网 ...

  8. 如何设置mysql root密码

    如何设置mysql root密码: 1.首次安装 root初始密码为空,注意就是没有密码,直接敲回车即可进入 D:\wamp\bin\mysql\mysql5.6.17\bin> mysql - ...

  9. RHEL8重置root用户密码步骤

    要先确定是否为RHEL 8系统. [root@zhangsan ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 8.0 (Oo ...

  10. 矩池云教程|体验 OpenAI 最近推出的 3D 生成模型 Shap-E!

    Shap-E 是由 OpenAI 最近推出的3D生成模型,使用者可以通过简单的文字或图像进行三维模型的生成,OpenAI 认为相比于点云的生成模型Point-E,Shap-E的收敛更快.本文将展示如何 ...