C语言实用基础大总结(高效快速学习精华、实用语句案例多)

一、基本库

一个基本的C程序首先看的就是对库的导入:

#include <stdio.h>

1、<stdio.h>输入输出库:主要用于输入输出函数的调用,即printf()和scanf(),是最常用的库。
2、<string.h>字符串库:主要存放对字符和字符串的处理的函数。
3、<stdlib.h>功能库:主要用于对内存的操作,以及存放绝对值、除商取余等函数。
4、<math>数学库:就是存放各种数学操作的库。

二、<math>数学库

以下是<math>库的常用函数:
1、三角函数与反三角函数

函数名 作用
sin(x) 求x弧度的正弦值
cos(x) 求x弧度的余弦值
tan(x) 求x弧度的正切值
asin(x) 求反三角函数arcsin(x),得到的结果的弧度
acos(x) 求反三角函数arccos(x),得到的结果是弧度
atan(x) 求反三角函数arctan(x)

2、指数和对数

函数名 作用
exp(x) 求e的x次方的值
log(x) 求以自然对数e为底x为真数的结果
log10(x) 求以10为底x为真数的结果

3、乘幂和开方

函数名 作用
pow(x,y) 求x的y次方的值,y可以为分数
fabs(x) 求x的绝对值
sqrt(x) 求x开方的值
fmod(x) 求x除以y后的余数

三、常用数据类型

C语言中常用的数据类型有以下:

char:字符型
unsigned char:无符号字符型
int:整型(4字节)
unsigned int:无符号整型(4字节)
long int:长整型
float:单精度浮点型(4字节)
double:双精度浮点型(8字节)

四、常用运算符及优先级

此表从上到下,表示优先级从高到低:

运算符 含义
++ 自增
自减
! 逻辑非
- 负号运算符
+ 正号运算符
* 乘法
/ 除法
% 取余
+ 加法运算符
- 减法运算符
<,>,<= ,>= 关系运算符
==、!= 等于,不等于
&& 逻辑与
|| 逻辑或
= 赋值运算符
逗号运算符

此处列出的只是常用的运算和和优先级,并非所有的,需要完整运算符及优先级顺序可参见以下博客:C语言运算符优先级列表(超详细)

五、输入和输出

在C语言中最常用的输入和输出函数是printf()和scanf()函数:
1、printf()输出函数

int a = 3;
printf("%d",a);

2、scanf()输入函数同理

int a;
scanf("%d",&a);  //需要使用取值符

3、常用的数据格式
%d:整型数据
%c:字符型数据
%f:单精度浮点型数据(float)
%lf:双精度浮点型数据(double)
%s:字符串数据(常量、数组或指针)

4、get-put类输入输出
这4个函数主要都是用于获得字符串和输出字符串的函数:

  • getchar()函数:获得字符
  • putchar()函数:输出字符
  • gets():获得字符串
  • puts()函数:输出字符串

其实gets和puts是可以用getchar和putchar来实现的:

	char ch;
	while((ch=getchar())!='\n')
	{
    
    
		putchar(ch);
	}
	printf('\n');
	char a[10];
	gets(&a);
	puts(a);

六、选择控制

1、if语句

if(判断条件){
    
    
	操作...
}
else if(条件){
    
    
	操作...
}
else{
    
    
	操作...
}

2、条件运算符

max = (a>b)?a:b;

这个语句的意思就是如果a大于b满足,则max等于a;否则就等于b
该思想也可以用于宏定义中:

#define B(a,b) a>b?a:b

该行表示的就是取a与b之间较大的一个数,然后赋值给max。
当然宏定义还有很多种用法,比如:

#define PI 3.1415926  //不带参的宏定义
#define Sum(a,b) a+b  //带参的宏定义

3、switch控制语句

switch(判断量){
    
    
	case 常量1: 语句1;break;
	case 常量2: 语句2;break;
	...
	case 常量n: 语句n;
	default: 语句;
}

七、循环控制

1、while循环语句
就是只要满足条件就一直循环的语句,括号内只需要一个判断条件就行。

while(判断条件){
    
    
	操作...
}

2、do while循环语句
就是至少执行一次的语句,执行一次do之后,再去判断while的括号是否成立,如果成立则再执行do中的内容;如果不成立,则跳出循环。
注意:while后有个分号

do{
    
    
	操作...
}while(判断条件);

3、for循环语句

for(语句1; 语句2; 语句3){
    
    
	操作...
}

for括号内的三个语句都用分号隔开,语句1常用来赋初值(可空);语句2是判断循环的条件(必须有),如果满足就执行循环;语句3是当执行完一次循环之后进行的操作(可空),常用来自增或自减。例如:

for(i=0; i<=10; i++){
    
    
	操作...
}

八、函数

1、函数的定义

类型标识符 函数名 (类型名 形参1, 类型名 形参2, ...){
    
    
	函数中的操作...
}

2、函数的调用

函数名([实参列表]);

3、函数的用法经验
(1)定义函数的时候,关于函数的参数和返回值是什么情况,完全取决于函数的功能。当编写函数的时候,一开始不要想着函数如何传参和函数的返回值应该是什么;
(2)而是当在编写代码的途中,要使用某些值,但是当前函数中不存在,此时就需要进行传参,这时候考虑怎么传参就是合适的时机;
(3)当函数编写完毕后,考虑是否要将某些结果返回给其他函数去使用,此时需要考虑返回值。

九、数组与指针

1、一维数组的定义和引用

类型名 数组名[常量] = {
    
    1,2,...};
int a[10] = {
    
    1, 2, 3};
数组名[下标];
int a[3] = {
    
    1, 2, 3};
printf("%d",a[2]);

2、二维数组的定义和引用

类型名 数组名[常量1][常量2] = {
    
    {
    
    1,2,...}, {
    
    11,12,...}};
int a[2][3] = {
    
    {
    
    1,2,3}, {
    
    4,5,6}};
int a[2][3] = {
    
    {
    
    1,2,3}, {
    
    4,5,6}};
printf("%d",a[1][2]);

以上是输出第1行第2列的元素,即6,下标是从开始排的。

3、转义字符

字符形式 含义
\a 响铃
\n 换行,将当前位置移到下一行开头
\t 水平制表,跳到下一个tab位置
\b 退格,将当前位置移到前一列
\r 回车,将当前位置移到本行开头
\f 换页,将当前位置移到下页开头
\v 竖向跳格
\ 反斜杠字符’’
双引号字符
" 空字符(字符串结束标志)
\ddd 1-3位八进制ASCII码所代表的字符
\xhh 1-2位十六进制ASCII码所代表的字符

4、指针
该知识点和用法在以下文章中已有详细介绍:
C语言指针深入透析(原来你一直没有搞懂C语言指针是因为没有理解其中的规律)

十、字符串处理函数

1、字符串连接函数:strcat(s1, s2) //将字符串s2连接到是s1

2、字符串复制函数:strcpy(s1, s2) //将字符串2拷贝到字符串1中

3、字符串比较函数:strcmp(s1, s2) //若s1<s2返回-1,若s1>s2返回1,若s1==s2返回0

4、字符串长度函数:strlen(s) //返回字符串s的实际长度,不包括末尾的\0

5、存储空间赋值函数:memset(s, 'e', 5) //将字符数组s前5个字符设置成字符‘e’

6、存储空间拷贝函数:

int a[5] = {
    
    2,3,4,5,6}, b[5];
memcpy(b, a, sizeof(a));
//将数组a中的内容拷贝到数组b中,空间大小为a的空间大小

7、字符处理函数:就是专门处理字符的函数,常用的有以下几个

int isupper(ch);  //检查ch是否为大写字符
int islower(ch);  //检查ch是否为小写字符
int isdigit(ch);  //检查ch是否为数字字符

十一、位运算

位运算主要是用于二进制和其他进制的计算,是数字电子技术和计算机基础类课程都会学到的基础内容。
1、按位与&: 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
0000 0011
0000 0101
0000 0001
按位与的结果是3&5=1

//C语言代码:
#include <stdio.h>
main()
{
    
    
	int a = 3;
	int b = 5;
	printf("%d",a&b);
}

2、按位或| :两个相应的二进制位中只要有一个为1,该位的结果值为1
0011 0001
0000 1001
0011 1001
按位或的结果是49|9=57

//C语言源代码:
#include <stdio.h>
main()
{
    
    
	int a = 49; 
	int b = 9;
	printf("%d",a|b);
}

3、按位异或^ :若参加运算的两个二进制位值相同则为0,否则为1,
即0∧0=0,0∧1=1,1∧0=1, 1∧1=0
0011 1001
0010 1010
0001 0011
按位异或的结果是:57^42=19

//c语言源代码:
#include <stdio.h>
main()
{
    
    
	int a=57;
	int b = 42;
	printf("%d",a^b);
}

4、取反运算~ :~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
0000 1001——>原数9
1 111 0110——>取反的结果是246

//C语言源代码:
#include <stdio.h>
main()
{
    
    
	int a = 9;
	printf("%d",~a);
}

5、 左移<< :用来将一个数的各二进制位全部左移N位,右补0

将a的二进制数左移2位,右边空出的位补0,左边溢出的位舍弃。若a=15,即0000 1111,左移2位得0011 1100。

//C语言源码
#include <stdio.h>
main()
{
    
    
	int a=15;
 	printf("%d",a<<2);
}

6、右移>> :将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
0000 1001——>数字9
0000 0010——>又移2位后的结果是2

#include <stdio.h>
main()
{
    
    
	int a = 9;
	printf("%d",a>>2);
}

另外需要注意的是,根据编译系统的不同,右移之后左边可能补0也可能补1。移如0称为逻辑右移,移入1称为算数右移。

7、位运算赋值
位运算符与赋值运算符可以组成复合赋值运算符。

  • 常用赋值:&=, |=, >>=, <<=,∧=
  • 例:
    a & = b相当于 a = a & b
    a << =2相当于a = a << 2

十二、结构体共用体

1、用typedef声明新类型名

typedef long long int LLint;  //将类型long long int起个名字叫LLint
LLint a=12334555, b;  //定义两个long long int类型的变量
typedef int * INTP;  //给int类型的指针起个名字叫INTP
INTP p1, p2;  //定义p1和p2两个指针

2、结构体
(1)结构体类型的声明

struct 结构体名称
{
    
    
	类型名1 成员名1;
	类型名2 成员名2;
	...
	类型名n 成员名n;
}变量1, 变量2... ;  //后面有个分号不能忘

(2)结构体变量、指针、数组的定义

struct student
{
    
    
	char name[20];
	int age;
	double score;
}std1, *pstd=&std1; stds[3];

其中,student是结构体类型,是一种数据类型了(与int、char这种一样);
然后,std1是一个student类型的变量,pstd是student类型的指针,stds是student类型的一维数组。

(3)结构体变量的引用
有三种方式可以引用结构体变量,其中.称为成员运算符,->称为指向运算符。

  • 结构体变量.成员名
  • 指针变量名->成员名
  • (*指针变量名).成员名

3、用结构体构造链表
在C语言中的链表简单来说就是:结构体变量中含有指向同类结构体变量的成员,就是拥有一个next指针成员,然后每次执行结构体都会自动跳转到下一个地址继续执行。

struct student
{
    
    
	char name[20];
	int age;
	double score;
	struct student *next;
}

以上,next指针就是指向下一个结构体变量的指针成员,当然这只是简单的链表,还有更深入的动态链表,此处就不做介绍了。

4、共用体
共用体的定义和结构体基本相同:

union 共用体名称
{
    
    
	类型名1 成员名1;
	类型名2 成员名2;
	...
	类型名n 成员名n;
}变量1, 变量2... ;  //后面有个分号不能忘

因此,共用体变量的引用也和结构体一样;它们之间的差别就是对内存的占用情况不同,对于只把C语言当成使用工具的开发者来说,这其实并不是需要掌握的重点。

十三、变量与作用域

1、动态类变量

auto变量 register变量
局部作用域 本函数内 本函数内
生存期 动态存储 本函数内

2、静态类变量

static变量 extern变量 不加任何说明符
作用域 本文件内 可扩展文件 本文件内
生存期 静态存储 静态存储 静态存储

十四、文件处理

1、文件指针:FILE *指针变量名;

2、打开与关闭

  • 打开文件:FILE *fopen("文件名", "使用方式");
  • 关闭文件:fclose(文件指针);

3、文件使用方式及含义

使用方式 含义
“r”(只读) 为输入打开一个文本文件
“w”(只写) 为输出打开一个文本文件
“a”(追加) 向文件文件尾添加数据
“rb”(只读) 为输入打开一个二进制文件
“wb”(只写) 为输出打开一个二进制文件
“r+”(读写) 为读写打开一个文本文件
“w+”(读写) 为读写建立一个新的文本文件
“a+”(读写) 为读写打开一个文本文件
“rb+”(读写) 为读写打开一个二进制文件
“wb+”(读写) 为读写建立一个新的二进制文件
“ab+”(读写) 为读写打开一个二进制文件

4、文件输入输出

  • fprintf()文件输出函数:fprintf(文件指针, "格式控制", 地址列表);
  • fscanf()文件输入函数:fprintf(文件指针, "格式控制", 地址列表);
  • getc()文件输入函数:getc(文件指针);
  • putc()文件输出函数:putc(文件指针);
  • fgets()函数:fgets(字符指针, 位数, 文件指针); 从ASCII文件中读入字符串
  • gputs()函数:fputs(字符指针, 文件指针); 把字符串输出到ASCII文件中

5、二进制文件读写

  • fwrite()函数:向指定文件以二进制方式写入若干字节的数据
fwrite(待传出数据的其实地址, 要写入的字节数, 多少个字节的数据, 文件指针);
  • fread()函数:从指定的二进制文件中读入若干字节的数据
fread(起始地址, 要读入的字节数, 多少个字节的数据, 文件指针);

6、读写位置与定位

  • feof()判断文件结束:feof(文件指针);
  • fseek()移动文件位置指针到指定位置上:fseek(FILE *p, long offset, int origin);
    fp是文件指针,offset是以字节为单位的位移量,origin是起始点。
  • ftell()获得指针当前位置:ftell(文件指针);

猜你喜欢

转载自blog.csdn.net/Viewinfinitely/article/details/109497746
今日推荐