【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. 【译】.NET 8 网络改进(三)

    原文 | Máňa,Natalia Kondratyeva 翻译 | 郑子铭 简化的 SocketsHttpHandler 配置 .NET 8 添加了更方便.更流畅的方式来使用 SocketsHttp ...

  2. JOISC 2019 记录

    Day1 T1 Examination 三维数点板子题,直接 cdq分治+树状数组,时间复杂度 \(O(n\log^2n)\). Day1 T2 Meetings 对于一个大小为 \(n\) 的树,我 ...

  3. NC54586 小翔和泰拉瑞亚

    题目链接 题目 链接:https://ac.nowcoder.com/acm/problem/54586 来源:牛客网 题目描述 小翔爱玩泰拉瑞亚 . 一天,他碰到了一幅地图.这幅地图可以分为 \(n ...

  4. Linux 中竖线“|”与双竖线“||”的意思

    linux中竖线'|',双竖线'||',&和&&的意思 对于初学者来说这几个意思可能只知道其中几个的意思,下面我们来看一下. 1.竖线'|' ,在linux中是作为管道符的,将 ...

  5. Maven如何打包可执行jar包

    假设我有一个maven项目叫:hello-world 新建一个HelloWorld类: package com.dylan.mvnbook.helloworld; public class Hello ...

  6. 项目实战:Qt球机控制工具 v1.0.0(球机运动八个方向以及运动速度,设置运动到指定角度,查询当前水平和垂直角度)

    需求   1.调试球机控制,方向速度,设置到指定的角度:  2.支持串口,485等基于串口的协议端口配置打开:  3.子线程串口控制和.子线程协议解析:  4.支持球机水平运动速度.垂直运动速度设置: ...

  7. 在Ubuntu搭建DHCP服务器

    一.提供DHCP的服务器,自己必须有固定的IP地址 不然局域网就乱了,服务器自身启动(比如搭建完DHCP服务后,重新启动了服务器)的时候,DHCP服务器没有IP地址,无法和自己的DHCP服务通信. 在 ...

  8. 第128篇:浏览器存储(cookie、webStorage、 IndexedDB)

    好家伙,本篇为<JS高级程序设计>第二五章"浏览器存储"学习笔记 我们先来讲个故事 一个"薅羊毛"的故事 (qq.com) 概括一下,就是 有个人通 ...

  9. 【Azure 存储服务】关于中国区Azure Storage Account 存储账号服务误删除后的恢复问题

    问题描述 在Azure上,如果需要恢复之前删除的存储账户(Storage Account), 有什么办法呢? 问题解答 Azure 现在推出了自主恢复已删除的存储账号的功能,具体步骤如下: 第一步: ...

  10. opencv库图像基础1-python

    opencv库图像基础-python 基本操作 图片颜色通道 非灰度图的颜色通道是红绿蓝,在opencv中默认是BGR的顺序 argparse模块 argparse 库是 Python 标准库中用于命 ...