C语言笔记大全

一 数据的变现形式

在计算机高级语言中,数据有两种表现形式:常量和变量。

1.1常量

1.1.1常用的常量有以下几类:

  1. 整型常量:
  2. 实型常量:有两种表示形式
  3. 字符常量:有两种形式的字符常量
  4. 字符串常量:如”ABC”、”123”等。
  5. 符号常量:用#define指令指定用一个符号代表一个常量。
  6. 地址常量:每一个变量、数组等的地址在程序运行期间是不能够改变的,称为地址常量。

1.2变量

  1. 变量就是在程序运行中,值可以改变的量。
  2. 标识符命名规则:只能由字母、数字、下划线’_’组成,并且只能由字母和下划线开头。

1.3数据类型

在这里插入图片描述

  1. C99还新增了布尔型(bool)和双长整型(long long int)两种基本整型数据类型。
  2. 整型数据类型
    在这里插入图片描述

1.4格式化输入输出函数

%d十进制
%o八进制
%x十六进制
%u无符号十进制
%c单个字
%s字符串
%f单精度
%lf双精度
%e科学计数法
  1. ‘*’符:表示输入项读入后不赋予相应的变量,跳过此值。
    如:scanf(“%d %*d %d”,&a,&b);输入1 2 3,则a=1,2被跳过,b=3。
  2. ‘#’符:对%c,s,d,u输出无影响,对于%o,x来说,输出前缀符o,0x
  3. scanf函数中double型数据需要使用%lf才能正常得到所输入的值,而输出可以%f输出。

二 运算符和表达式

2.1基本的算术运算符

在这里插入图片描述

2.2.1自增、自减运算符(单目运算符)

  1. ++(自增运算符)、–(自减运算符)
++i;--i;(在使用i之前,先使i的值加(减)1,先加减后使用)
i++;i--;(在使用i之后,使i的值加(减)1,先使用后加减)

2.2.2运算符优先级

在这里插入图片描述

2.2表达式

  1. 表达式语句
    表达式语句是由一个表达式加一个分号构成,
    例如:a=3是赋值表达式,而a=3;是赋值语句。
  2. 控制语句
    控制语句用于完成一定的控制功能。
if()else…		(条件语句)
②for()....		(循环语句)
③while()…		(循环语句)
④dowhile();	(循环语句)
⑤break			(结束整个循环语句)
⑥continue		(结束本次循环语句)
⑦switch			(多分支选择语句)
⑧return			(函数返回语句)
⑨goto			(转向语句,在结构化程序中基本不用goto语句)
  1. 函数调用语句
  2. 空语句
  3. 复合语句

三 选择结构和循环结构

3.1 选择结构

C语言提供了两种选择结构:if语句和switch语句。

3.1.1if语句

If语句的一般形式:

根据if语句的一般形式,可以写成不同的形式,最常用的有以下三种形式:
(1if(表达式)语句1;	//单独的一个if语句,用于实现两个分支的判断选择2if(表达式)语句1;	//if和else组合,用于实现两个分支的判断选择
else 语句2;3if(表达式)语句1;	//if else嵌套,用于实现多分支结构
else if(表达式)语句2;	//if和else的配对问题,就近原则
else if(表达式)语句3;	//else和前面最近的没有配对的if配对
else语句4;……

3.1.2switch语句

switch语句的一般形式:

switch()
{
case 常量1:语句1case 常量2:语句2case 常量3:语句3case 常量4:语句4case 常量5:语句5;
……
case 常量n:语句n;
default:语句n+1;
}

3.2循环结构

3.2.1循环结构的分类

  1. 当型循环
    当循环条件满足时才执行循环体中的语句。
for循环
for循环的一般格式为:
for(表达式1;表达式2;表达式3)
{
循环体;
}

for(int a=0;a<10;a++)
printf(“a=%d\t”,a);while循环
while循环的一般格式为:
while(表达式)
{
循环体;
}
  1. 直到型循环
    直到条件不满足时才结束循环。
do  while循环
do  while循环的一般格式:
do
{
循环体;
}while(表达式)

四 数组

4.1什么是数组

  1. 数组是一组有序数据的集合。
    数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。

  2. 用一个数组名和下标来唯一地标识确定数组中的元素。

  3. 数组中的每一个元素都是属于同一数据类型。
    规定不能把不同数据类型的数据放在同一个数组中。

4.2一维数组的定义和引用

  1. 定义一维数组
基本格式:数据类型 数组名[数组大小];
如:float S[60]; 
//定义一个浮点型数组,取名为S,大小为60,用于保存60个学生的成绩。
其中,flost为数据类型(int、char、double),S为数组名,60为数组下标,也就是数组的大小。
  1. 使用数组及引用数组元素
基本格式:数组名[下标];
如:S[0]=1; 
S[1]=S[0];
S[10]=S[0]+S[1];

注意: 在定义数组时,需要指定数组中元素的个数,也就是数组的大小

  1. 一维数组的初始化
可以用“初始化列表”方法实现数组的初始化。
如:int a[10]={0,1,2,3,4,5,6,7,8,9};
也可以只给数组的部分元素赋初值。
如:int a[10]={0,1,2,3,4};

4.3二维数组

  1. 定义二维数组
基本格式:数据类型 数组名[数组行数][数组列数];
如:int a[3][4];
此二维数组有34
二维数组的内存:行数*列数*单个元素类型所占字节数
  1. 二维数组的初始化
  • (1)给全部元素赋值:
int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
//定义一个3行4列的二维数组,并给它的元素初始化赋值
int arr[3][4]={};//全部赋值为0
int arr[3][4]={0};//全部赋值为0
  • (2)给每一行元素赋值:
int arr[3][4]={{1,2,3,4},
{1,2,3,4},
{1,2,3,4}
}
  • (3)给部分元素赋值:
//可以不指定数组行大小
int arr[][3]={1,2};
//给数组前两个元素赋值,数组行数为1,此行最后一个元素默认为0
int arr[][3]={1,2,3,4};
//给数组前四个元素赋值,数组行数为2,第二行最后两个元素默认为0
int arr[][3]={{1,2},{3,4}};
//给数组每行的前两个元素赋值,数组行数为2,每行最后一个元素默认为0
  1. 二维数组元素的访问
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
a[0][0];	//访问数组第1行第1个元素
a[1][0];	//访问数组第2行第1个元素
a[2][1];	//访问数组第3行2个元素

4.4字符数组

字符数据简单的来说就是char类型的数组。

  1. 字符数组的定义及初始化
//定义一个字符数组c,并以单个字符初始化赋值
如:char c[6]={‘a’,’b’,’c’,’d’,’e’,’f’}; 
char s[7]=”abcdefg”;	//定义一个字符数组c,并以字符串初始化赋值
  1. 引用字符数组中的元素
如:char s[10]; //定义一个字符数组
s[0]=’a’;	//引用字符数组s的第一个元素s[0]并赋值
s[1]=’b’;	//引用字符数组s的第二个元素s[1]并赋值
  1. 字符数组的输出
如有定义以下字符数组:
char s[7]=”abcdefg”;
方法一:以%c的格式循环输出
for(int i=0;i<7;i++)
{
printf(%c”,a[i]);
}
方法二:以%s的格式输出
printf(%s”,a);
  1. 字符串处理函数
包含头文件#include<stdio.h>

puts(字符数组);	//输出字符串
gets(字符数组);	//输入字符串
strlen(字符串)	//测字符串长度函数
strcat(字符数组1,字符数组2);	//字符串连接函数
strcpy(字符数组1,字符数组2);	//字符串复制函数
strcmp(字符串1,字符串2);	//字符串比较函数

五 函数

5.1什么是函数

从本质意义上来说明函数就是用来完成一定功能的,是把实现功能的代码封装起来,给这些封装起来的代码取个名字就是函数名。

5.2函数的定义,

在程序中用到的所有函数,必须“先定义,后使用”。

  1. 定义无参无返回值函数
类型名 函数名()
{
函数体
}
或
类型名 函数名(void)
{
函数体
}
在函数体里描述函数实现的功能。
  1. 定义有参数无返回值函数
void 函数名(函数参数1,函数参数2,……)
{
函数体
}
void max(int x,int y)
{
int z;
z=x>y?x:y;
printf(%d\n”,,z);
}
//求最大值函数,输出两个数之间的最大值
  1. 定义有参数有返回值函数
类型名 函数名(函数参数1,函数参数2,……)
{
函数体
return ;
}
int max(int x,int y)
{
int z;
z=x>y?x:y;
return z;
}
//求最大值函数,返回两个数之间的最大值
  1. 定义无参数有返回值函数
类型名 函数名()
{
函数体
return ;
}
void为空类型

5.3函数的调用

  1. 函数调用的基本格式:函数名(实参列表);
如:int a=10,b=20,c;
c=max(a,b);	//函数调用语句,调用max函数求a和b两个数中的最大值赋值给c
  1. 函数参数
    函数的参数分为实参和形参。
    在调函数时,我们将调用其他函数的函数称为主调函数,将被调用的函数称为被调函数。在调用有参函数时,主调函数和被调函数之间有数据传递关系。主调函数中将值传递出去的参数称为“实际参数”(简称实参),被调函数中用于接收主调函数所传递过来值的参数称为“形式参数”或“虚拟参数”(简称形参)。

  2. 实参和形参之间的数据传递

在调用函数的过程中,系统会把实参的值传递给被调函数的形参,或者说形参从实参得到一个值。
函数调用过程中需要注意以下几点:
1)实参可以是常量、变量或表达式。如:max(3,a+b);
2)实参与形参的数据类型应相同或者赋值兼容,并且实参在实参列表中的位置与形参在形参列表中的位置必须对应。
3)函数遇到return返回语句返回过后,不再继续执行return之后的语句了。
4)形参在其所在函数的调用期间有效,可以参加此函数中的运算,但是不能用于其他函数中。
5)函数的形参和实参是两个不同的变量,所以,一般情况下形参值的改变不影响实参的值,除非在函数参数的传递类型为引用传递(地址传递)。在未调用函数时,形参并不占用存储单元,开始函数调用时,才给形参开辟存储空间,函数调用结束后,形参的存储单元就会被释放。
  1. 函数的返回值

5.4函数的声明

  1. 在一个函数中调用另一个函数(即被调函数)需要具备以下条件:

(1)首先被调用函数必须是已经定义好的函数(库函数或自定义的函数)。
(2)如果使用库函数,应该在本文件开头用#include指令将调用相关库函数时所需用到的信息“包含”到本文件中来。如:#include<stdio.h>。
(3)如果使用用户自定义的函数,在调用函数之前必须要有被调函数相关的声明语句,也就是函数需要先声明后使用。

函数声明语句的一般格式:
函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,……,参数类型n 参数名n);

5.5局部变量和全局变量

  1. 局部变量
    局部变量的作用范围只在一定范围内有效
    局部变量的定义可能有以下几种情况:
    (1)在函数开头定义;
    (2)在函数内部的复合语句中定义;
  2. 全局变量
    全局变量的作用范围相对于局部变量来说更为广泛,其在函数外部定义,也称为外部变量

5.6函数的递归调用

  • 递归调用的一般格式:
x= function(int n)
{
if(0==n)return n; //结束递归的条件
return n+function(n-1); //这里在函数中调用此函数本身,实现递归
}

注意:递归的函数中应有结束递归的条件,否则会和死循环一样,陷入无限递归,或者说死递归。

六预处理

预处理是在编译前所做的工作,编译器自动调用预处理程序对源码中以’#’开头的预处理部分进行处理,处理完毕后,进入源码的编译阶段。

  1. 预定义符号:
常用的预定义符号:
__FILE__     : 当前编译的文件名.   
__FUNCTION__ : 当前所在函数的函数名.
__DATE__     : 当前编译日期.
__TIME__     : 当前编译时间.
//以上格式占位符都用%s ,如:printf("%s",__DATE__);
__LINE__:当前行数. // 格式占位符用%d,如:printf("%d",__LINE__);
  1. 条件编译: 根据不同的条件编译不同代码段.
----------------------------------------------------------------------------------------------
  #if 表达式	
//判断表达式的逻辑值(真或假),若逻辑值为真,则编译代码段1,否则编译代码段2.     
  代码段1;                                          
  #else                                 
  代码段2;                                     
  #endif
  ----------------------------------------------------------------------------------------------
  #ifndef 宏名
//如果没有定义宏"宏名",则编译代码段1,否则编译代码段2;   
  代码段1;                                          
  #else                                       
  代码段2;                                     
  #endif   

七 结构体

7.1定义和使用结构体变量

  1. 结构体类型的声明和结构体变量的定义
  • (1)声明一个结构体类型的一般形式为:
struct 结构体类型名{成员列表}
  • (2)定义一个结构体类型的变量:
例如:学生类结构体
struct student{
int id;	//学生学号
char name[10];	//学生姓名
char sex[4];	//学生性别
int age;	//学生年龄
int score;	//学生成绩
char address[20];	//学生家庭住址
}S1,S2,S3;	//声明时定义结构体变量S1,S2,S3
//这里定义了一个结构体,其中struct student为结构体类型名,id、name、sex、age、score、address为结构体成员名,S1、S2、S3为结构体变量名。

#注意:一定要区分清楚什么是结构体类型名、结构体成员名和结构体变量名。

int main()
{
struct student S4,S5;//声明之后使用结构体类型名定义的结构体变量S4,S5
return 0;
}
  • (3)不指定结构体类型名而直接定义结构体类型的变量
struct //这里缺省了结构体类型名
{
成员列表;
}变量名列表;
如:srtuct	//这里没有规定结构体类型名
{
int id;
char name[10];
char sex[4];
int age;
int score;
char address[20]; 
}t1,t2,t3;	//由于没有规定类型名,所以变量只能声明时定义

#注意:以此方式定义结构体,由于没有结构体类型名,只能在声明时定义此结构体的变量,而不能再以此结构体类型名去定义其他变量了。(这种方式用得不多)

  1. 结构体变量的初始化和引用
  • (1)结构体变量的初始化:
srtuct teacher{
int id;
char name[10];
char sex[4];
int age;
int score;
char address[20]; 
}t1={666,”小明”,”男”,18,0,”甘肃天水”},t2,t3;
//这里给srtuct teacher类型的结构体变量t1赋初值(初始化)
//在定义结构体变量的同时给变量赋初值,应按次序给每一个成员或部分成员赋值
  • (2)结构体变量和成员的引用
结构体成员引用符:’.’
结构体成员引用的一般格式:结构体变量名.成员名
如:s1.id=1;、s2.name、s3.score
  1. 使用typedef关键字自定义类型名
typedef:简单来说就是用一个新的类型名代替原有的类型名。
typedef int I;
  • typedef一般使用在数据类型名比较长的情况下,
如:声明结构体
typedef struct student{
int id;	//学生学号
char name[10];	//学生姓名
char sex[4];	//学生性别
int age;	//学生年龄
int score;	//学生成绩
char address[20];	//学生家庭住址
}S; //这里的S是代表struct student这个数据类型的别名,而不是结构体的变量名了。

7.2结构体数组

  1. 结构体数组的定义
例如:struct student S[3];
//这是一个struct student类型的结构体数组,
//此数组中有三个struct student结构体类型的元素,分别为S[0],S[1],S[2]。
  1. 结构体数组元素的使用
结构体数组名[数组下标].成员变量名;
例如:S[0].id=1;
//struct student类型的结构体数组S的第1个元素S[0]的成员id,使其值等于1
printf(%s\n”S[2].name);
//输出struct student类型的结构体数组S的第3个元素S[2]的成员name的值

八 共用体

  1. 什么是共用体
共用体关键字:union
union 共用体名
{
成员列表;
}变量列表;

如:union DATA
{
int a;
double b;
char c[10];
}d1,d2,d3;
d1.a=10;	d1.b=6.6;	strcpy(d1.c,”abcdefg”);	
//这里分别给共用体成员赋值。
  1. 共用体类型所占内存
如:union DATA
{
int a;
double b;
char c[10];
}d1,d2,d3;
printf(%d\n”,sizeof(d1));	
//这里输出共用体的内存大小为16(两个double的大小

九 枚举

  1. 枚举类型的声明
枚举类型关键字:enum
enum 类型名{枚举元素列表};
例如:enum Weekday{sun,mon,tue,wed,thu,fri,sat};
枚举常量的引用和输出:
如:printf(%d”,sun);//输出整数0
枚举变量的引用和输出:
如:workday=mon;
printf(%d”,workday);//输出整数1

总结

C语言是最基础的,不过好长一段时间不用的话就会忘掉。我发现之前学过的一些差不多忘记了。所以我把笔记整理了一遍。希望对我们都有帮助。
在这里插入图片描述

  • 14
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
C语言是一种广泛应用于软件开发的编程语言,具有简洁、高效、灵活等特点。为了更好地学习和掌握C语言,整理一份完整的笔记是非常有必要的。 首先,C语言的基础知识是理解和掌握该语言的关键。笔记中应包含C语言的基本语法,如变量的声明和定义、数据类型、运算符、控制语句等,这些是编写C程序的基础。 其次,C语言的函数也是非常重要的一部分。函数是C语言中的一种模块化的编程方式,可以提高代码的重用性和可维护性。在笔记中应包含函数的定义和调用、参数传递、函数返回值等内容,以及常用的C库函数的使用。 此外,C语言的数组和指针也是需要重点关注的内容。数组是一种存储多个相同类型数据的方式,而指针则是C语言中与内存地址相关的操作。在笔记中应包含数组的定义和初始化、多维数组的使用、指针的声明和运算等内容。 还有,C语言中的内存管理是需要特别注意的。动态内存分配是C语言的一个重要特性,可以根据需要在运行时分配和释放内存。笔记中应包括动态内存分配的函数,如malloc、free等,以及内存泄漏和内存溢出的问题的解决方法。 最后,C语言的文件操作也是需要掌握的一部分。文件操作是C语言中与磁盘文件进行读写的关键部分,可以实现数据的长久保存和共享。在笔记中应涵盖文件的打开和关闭、读取和写入、文件指针的操作等内容。 综上所述,C语言笔记的完整版应该包含C语言的基础知识、函数、数组和指针、内存管理以及文件操作等内容。通过阅读和整理笔记,可以更好地理解和应用C语言,提高程序编写的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘客-追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值