C语言知识点汇总

流程图画法

图片来源

还要了解N-S流程图画法

程序设计的三个基本结构特点

采用结构化程序设计方法,程序结构清晰,易于阅读、测试、排错和修改。由于每个模块执行单一功能,模块间联系较少,使程序编制比过去更简单,程序更可靠,而且增加了可维护性,每个模块可以独立编制、测试。

顺序结构

顺序结构是一种线性、有序的结构

选择结构

选择结构是根据条件成立与否选择程序执行的通路

单分支,双分支,多分支,swith

循环结构

循环结构是重复执行一个或几个模块,直到满足某一条件为止

while 和do while(当型和直到型)

详见总结选择结构程序设计

循环结构程序设计

变量

变量,常量,符号常量的区别

声明一个变量,表示可以通过声明的变量名来访问一块内存(这块内存的大小是通过类型来限制的)

常量就是一个不变的量,比如说常数

字符常量,就是不能修改的量,通常用define或者const修饰

1
const int   i = 0;

编译器对宏定义只做单纯的文本替换(这可能造成隐性错误),而对const常量会进行检查

类型强制转化

语法(主动强制转换)

1
强制转换的类型 (数据);

强制转化可能会导致数据精度的变化,比如把一个高精度类型强转为一个低精度的类型

强制转换有时会带来问题,比如赋值超出强转的类型表示的范围,造成值溢出

另外,赋值时候可能会有隐性的类型转换

1
2
3
int a=0;
float b=1.1;
a=b;

最后a的值就是1

输入输出的形式

输入/输出通常使用 printf() 和 scanf() 两个函数

%d 格式化输出整数

%f 格式化输出浮点型数据

变量存储方式

静态存储方式,一般在编译期间就确定了 存储空间,直至整个程序结束

动态存储方式是程序运行期间,根据需要进行动态的分配存储空间

变量作用域

局部变量, 作用域仅限于函数内部, 离开作用域后就失效

全局变量, 作用域默认是整个程序

变量生存周期

自动变量auto

静态变量static

寄存器变量register

外部变量extern

详细参考顺序程序设计

数组

一维数组

一段连续的内存空间,存储的一系列类型相同的数据

二维数组

二维数组存储方式类似一维数组,不过二维数组的第一个元素还是一个一维数组

声明

1
2
int a[2][2]; 
//类型 数组名[行数][列数];
二维数组作为函数参数

原链接

1
void Func(int (*array)[10]);

声明参数是一个指针,它指向具有10个元素的一维数组

1
void Func(int *array[10]);

声明了一个数组,该数组有10个元素,每个元素都是一个指向整型对象的指针

二维数组的输出

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# include <stdio.h>
int main(void)
{
int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int i; //行循环变量
int j; //列循环变量
for (i=0; i<3; ++i)
{
for (j=0; j<4; ++j)
{
printf("%d", a[i][j]);
}
printf("\n");
}
return 0;
}

考点

字符数组

声明

1
char c[5];

C中没有专门的字符串变量,通常用一个字符数组来存放一个字符串,字符串以’\0’作为串的结束符

输出例子

1
2
3
4
5
6
#include <stdio.h>
int main(void){
char c[]="hello";
printf("%s\n",c);
return 0;
}
数值数组

输入输出差别

数值数组常见的控制显示的格式符略

字符串

字符串的输出函数

1
int puts(char const*strPtr);

输出字符串,传入的实参可以是字符串数组也也可以是字符指针

字符串的输入

1
char *gets(char *strptr);

输入一个字符串存放到指针strptr指向的字符数组

获取字符串长度

1
int strlen(char const*string);

获取字符串的长度,返回字符的个数,不包括\0结束符

字符串拷贝函数

1
2
char *strcpy(char*des,char*src);
char *strncpy(char *des,char *src,int size);

把src指向的字符串拷贝到des指向的字符串数组中去,结束符也一同进行拷贝,size参数也可以拷贝制定长度的字符串

字符串的连接函数

1
2
char * strcat(const *char str1,const *char str2);
char *strncat(const *char str1,const *char str2,int size);

将str2指向的字符串连接到str1指向的字符后面,会删除str1后

面的’\0’,返回str1指向字符串的首地址

字符串比较函数

1
int strcmp(const char * str1,const char *str2);

按照ascii码来进行比较,并由函数返回值进行判断
返回0,字符串1等于字符串2,
大于0,字符串1大于字符串2,
小于0,字符串1小于字符串2,

字符串分割函数

1
char* strtok(char *str,const char *delimiters);

根据delimiters指向的分割符号,将str指向的字符串分割成若干个子字符串,返回的是分割出的子字符串

字符串中是否包含字符

1
2
3
4
char * strchr(const char *,int c);
//从左往右寻找字符c
char * strrchr(const char *,int c);
//从右往左开始寻找字符c

判断字符串中是否包含字符串

函数

声明

1
2
int a(int x,int y);
//返回值类型 函数名(参数列表);

函数声明声明了函数的名字,参数个数,参数类型,函数返回类型

值传递的特点

从实参到实参是参数传递,传递的是一份值的拷贝

例子

递归函数,递归调用

例子:求和,阶乘

分段函数

判断素数,开平方数,求整数因子,最大公约数(辗转相除)求和

指针

指针与其他类型的关系

  • 字符
  • 数组
  • 结构体,和结构体变量

指针作为函数参数,进行函数调用

结构体

结构体

形式

成员引用,赋值,输入,输出

结构体指针

枚举

循环,分支判断

文件操作

文件指针,打开读写