第一章:C语言基础总结

本文全面概述C语言基础知识,包括变量、数据类型、运算符、控制结构、数组、指针、函数、字符串及结构等内容,深入讲解每部分概念与应用,适合初学者和进阶者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言基础总结,不对的请指正,谢谢。

#include<stdio.h>
int main()
{

	printf("HelloWorld!");
	return 0;
}
//变量是计算机中一块特定的内存空间。 
	//变量:一个数据存储空间的表示
	//不同数据存入具有不同内存地址的空间,相互独立。
//变量的命名规则
	//变量名只能由字母、数字和下划线3种字符组成
	//第一个字符必须是字母或者下划线
	//不能使保留字/关键字
//数据类型
	//数值类型-整型:int(整型),short(短整型),long(长整型)。
	//数值类型-非整形(浮点型):float(单精度浮点型),double(双精度浮点型)。
	//非数值(字符类型):char

//C语言常用数据类型
	//整型    		int         32位      -2147483648~ +2147483647	
	//短整型  		short int   16位      -32767~+32768
	//长整型  		long int    32位      -2147483648~ +2147483647
	//单精度浮点型  float       32位      -3.4E-38~+3.4E+38
	//双精度浮点型  double      64位      -1.7E-308~1.7E+308
	//字符型        char        8位       -128~+127
	
//数据类型   变量
	//数据类型:用来规定变量的内存空间有多大
	//变量名命名规则:
					  1.首字母:下划线“_”和普通字母
					  2.其他字母:下划线“_”、普通字母和数字
					  3.不能是关键字
//位运算符中:  “比较时,数字要转为二进制”
    //     &       按位与              两个操作数同时为1时结果为1
	//	   |       按位或              两个操作数只要有一个为1,结果就为1
	//     ~       按位非              操作数为1,结果为0;操作数为0,结果为1
	//     ^	   按位异或            两个操作数相同,结果为0;不相同结果为1
	//     <<      左移                右侧空位补0
	//     >>      右移                左侧空位补符号位
	//     >>>     无符号右移          左侧空位补0
//sizeof运算符
	//使用sizeof运算符可以获得数据类型占用内存空间的大小
	//基本用法:sizeof(type name)
	//结果以字节为单位
//运算符优先级       (由下至上优先级增加)
	//    ()   sizeof   ++    --
	//     !
	//     算数运算符
	//     关系运算符
	//     &&
	//     ||
	//     赋值运算符
//switch结构                                                          //使用switch结构使得注意点  
	//		switch(表达式)										  		//switch后的表达式只能是整型或字符型
	//		{														  		//case后常量表达式的值不能相同
	//		case 常量1:													//case后允许许多条语句,不需要大括号
	//		     语句1;													//如果不添加break语句,需要特别注意执行顺序
	//			 break;													//case和default子句的先后顺序可以自行变动
	//		case 常量2:													//default子句可以省略
	//			 语句2;															
	//			 break;														
	//		......														
	//		default:													
	//			 语句;     //(不在上述case范围内)
	//		}
//while循环                                                //循环三要素:                                      //while循环特点:先判断,再执行
	//while(循环条件)                                      //1、循环变量的初值
	//{													   //2、循环变量的判断
	//循环操作语句										   //3、循环变量的更新
	//}
//使用codeblocks调试c程序
	//步骤:
		1、分析错误
		2、设置断点
		3、启动调试
		4、单步运行
		5、观察变量
		6、发现问题
		7、修正代码重新运行	
//do-while循环
	//基本语法:											//特点:先执行,再判断
		{do														//	先执行一遍循环操作
		循环操作												//符合条件,循环继续执行
		}while(循环条件);									//否则循环退出
//while循环和do-while循环区别
	//执行顺序不同
	//初始情况不满足循环条件时
		//while循环一次都不会执行
		//do-while循环不管任何情况都至少执行一次
//调试:确保路径里面没有中文以及特殊符号
//for循环
	//语法
		for(表达式1;表达式2;表达式3)						//表达式1,通常是为循环变量赋初值,可以省略。 
		{													//表达式2,循环条件,是否继续执行循环,可以省略。
			语句;											//表达式3,更新循环变量的值,可以省略。
		}													//分号,用来分隔三个表达式,不可以省略!    for(;;)是死循环。
//for循环常见问题
	//忘记定义循环变量或初始化
	//循环条件缺少时会造成死循环
	//循环变量不更新也会造成死循环
	//不可省略分号
//break语句的作用                               //break能跳出switch语句也能跳出循环语句(for;while;do-while);当for循环语句中存在break,则最后的++或者--都不会执行。
	//跳出循环,执行循环之后的语句(跳出整个循环)
//continue语句
	//continue语句的作用
		//跳过本次循环,继续下次循环
			//////////////////////////////////
				while(循环语句)					
				{......
				continue;    //跳到循环条件去
				 ......
				}
			//////////////////////////////////	
				do 
				{......
				continue;    //跳到循环条件去
				 ......
				}while(循环条件)
			//////////////////////////////////
				for(;循环条件;更新循环变量;)
				{......
				continue;    //跳到更新循环变量去
				 ......
				}
//break和continue的区别:
	//使用场合
		//break可用在switch结构和循环结构中
		//continue只能用在循环结构中
	//作用(循环结构中)
		//break语句用于终止某个循环,程序跳转到循环块外的下一条语句
		//continue跳出本次循环,进入下一次循环
//循环结构总结
	//相同点
		//多次重复执行一个或多个任务时考虑使用循环来解决问题
	//区别
		//除了语法不同,判断和执行顺序也不同
		//适用情况不同
			//循环次数确定的情况下,通常选用for循环
			//循环次数不确定的情况时,通常选用while和do-while循环
//数组             
	//数组是一个变量,由数据类型相同的一组元素组成
			//数组与变量之间的区别:变量是内存中的一块空间;	数组是内存中一串连续的空间(连续的内存空间)。
	//数组的结构和基本要素
		//标识符:数组的名称,用于区分不同的数组
		//数组元素:向数组中存放的数据
		//元素下标:对数组元素进行编号
		//元素类型:数组元素的数据类型     (强调:数组中的所有元素必须属于相同的数据类型)
		
		//数组只有一个名称,即标识符(用来表示数组的变量名)
		//元素下标标明了元素在数组中的位置,从0开始
		//数组中每个元素都可以通过下标来访问
		//数组长度固定不变,避免数组越界
	//数组的语法:datatype arrayName[size];
		//例1:
			int nums[25];
			char array_of_name[30];
			double curr_salary[35];
		//例2:
			#define N 50
			int emp_id[N];
			......
			const int SIZE = 100;
			double prices[SIZE];
//数组总结
	//数组是可以在内存中连续存储多个元素的结构
		//数组中的所有元素必须属于相同的类型
	//数组必须先声明,然后才能使用
		//声明一个数组只是为该数组留出内存空间,并不会为其赋任何值
	//数组的元素通过数组下标访问
	//一维数组可以用一个循环动态初始化,而二维数组可以用	嵌套循环动态初始化
	//二维数组可以看做是由一维数组的嵌套而构成的
//二维数组
	//语法;
		//datatype name[rowSize][colSize]
		//double score[5][3]
		//int animate[4][4]
	
	

//指针(pointer)简介
	//指针是一个值为内存地址的变量(或数据对象)(内存地址一般使用16进制表示)
//指针的基本用法
	//数据类型*指针变量名;
	//例如:
			int*ptr_num;
			char*ptr_name;
			float*money_ptr;
			double*p_price;
	//注意:在头文件<stdio.h>中,NULL被定义为常量(它表示0)
			int*ptr_num=NULL;
			指针的初值设置为空,表示指针不指向任何地址
	
//指针小节
	//指针同样是一个变量,只不过该变量中存储的是另一个对象的内存地址
	//如果一个变量存储另一个对象的地址,则称该变量指向这个对象
	//指针变量可以赋值,指针的指向在程序中可以改变
		//指针p在执行中某时刻指向变量x,在另一时刻也可以指向y
	//注意:
		(1)指针变量的命令规则和其他变量的命名规则一样
		(2)指针不能与现有变量同名
		(3)指针可以存放C语言中任何数据基本类型、数组和其他所有高级数据结构的地址
		(4)若指针已声明为指向某种类型数据的地址,则它不能用于存储其他类型数据的地址(例如:int型指针里面不能存放double型数据)
		(5)应为指针指定一个地址后,才能在语句中使用指针
		
//指针与数组
	//数组(数组首地址和数组首元素地址一样;数组名就是数组首元素地址)
		//存储在一块连续的内存空间中
		//数组名就是这块连续内存空间的首地址
	//指针的算术运算
		//指针的递增和递减(++,--)		注意:一个类型为T的指针的移动,以sizeof(T)为移动单位
	//数组名就是这块连续内存单元的首地址
		//int num[50];//num是数组名,也是数组的首地址
		//num的值与&num[0]的值是相同的
		//数组第i + 1个元素可表示为:
			//第i + 1个元素的地址:&num[i+1]或num + i
			//第i + 1个元素的值:num[i+1]或*(num + i)
		//为指向数组的指针赋值:
			//int * ptr_num = num;或int * ptr_num = &num[0]
		//指针变量可以指向数组元素
			//int * ptr_num = &num[4];或int * ptr_num = num + 4;
//二维数组与指针
	//如:5行3列的二位数组
	//首地址:&a[0][0]     也是认为数组的数组名
	//使用指针访问二维数组中元素
		//*(a[1]+2)
		//*(*(a+1)+2)					num[i][j]等价于*(*(num + i) + j)   二维数组  重点!!!!!!!!!!!!            num[i]等价于*(num + i)		一维数组
//指针总结
	//指针是一个变量,存储另一个变量(对象)的内存地址        (指针不可以赋常量)
	//指针的声明由基本类型、星号(*)和变量名组成
	//为指针赋值,赋值运算符右侧不许是一个地址
		//如果是普通变量需要在前面加一个取地址运算符&
		//如果是另一个指针变量或者是一个数组,不需要加&运算符
	//运算符*用于返回指针指向的内存地址中存储的值
	//使用指针访问一维数组和二维数组的元素
	//指针和字符串
	
	
//函数(function)
	//是完成特定任务的独立程序代码
	//语法规则定义了函数的结构和使用方法
//为什么要使用函数
	//可以省去编写重复代码的苦闷
	//可以让程序更加模块化,提高代码可读性
	//方便后期修改,完善
//函数的种类
	//内置函数
		//由C语言系统提供
		//需要在程序前包含定义函数的头文件
	//自定义函数
		//不带参数
		//带参数
//内置函数补充:malloc和calloc
	//malloc动态分配内存:为指针分配5个元素的空间
		#include <stdio.h>
		#include <stdlib.h>
		void main()
		{
			int * num;
			int i;
			num = (int *)malloc(sizeof(int) * 5);//malloc需要强制转换
			num[4] = 9;
			for (i=0;i<5;i++)
			{
				printf("%d\n",num[i]);
			}
			free(num);//用完释放内存
		}
	//calloc和malloc类似。1:不需要强转,直接返回数组;2:两个参数,默认初始化数组元素。
	//calloc使用:为指针分配5个元素的空间
		#include <stdio.h>
		#include <stdlib.h>
		void main()
		{
			int * num;
			int i;
			num = calloc(5,sizeof(int));//calloc不需要强制转换
			num[4] = 9;
			for (i=0;i<5;i++)
			{
				printf("%d\n",num[i]);
			}
			free(num);//用完释放内存
		}
	//关于以上的free函数:
		1、必须是通过malloc、calloc和realloc(重新分配内存)分配内存的指针
		2、释放的指针必须是初始分配的地址,进行运算后需要恢复
//自定义函数
	//函数定义
		return_type function_name([datatype1 arg1],[datatype2 arg2],[...])
		{
		//函数体
		}
	//函数三要素
		//返回值类型
		//函数名
		//参数列表
	//自定义函数的完整写法		注意1:函数原型与函数定义的头部类似,最后以分号结尾;注意2:函数原型中的参数名称可以省略,只写参数类型。
		#include <stdio>
		//函数原型
		int sum(int,int);
		int main()
		{
			...
		}
		//函数定义
		int sum(int num1,int num2)
		{
			//函数实现的代码
		}
	//C语言中的返回值
		//关键字:return
		//只能返回一个值,不能返回多个值
		//返回值类型必须与原型中的返回值类型匹配
		//return会立即终止函数,并返回
//递归
	//函数点用自己的过程叫做递归	(递归所实现的业务逻辑大部分是可以通过循环来实现的)
	
///////C语言进阶///////		变量的作用域和生存周期;变量的两种传递方式;使用带参函数解决实际问题;使用数组作为函数参数;使用头文件。

//变量的作用域和生存周期
	//注意1:变量只存在于定义它们的语句块中;
	//变量在一个块内声明时创建,在这个块结束时销毁-自动变量
	//变量存在的时间就是变量的生存期
//小结
	//变量的作用域:
		//全局、局部
	//变量的生存周期
		//变量的存储方式:动态存储(自动、寄存器)、静态存储(静态和外部)
		//由变量的存储方式不同而产生的特性称为变量的生存期(变量的存在时间)
		//基本类型的静态变量系统默认赋初值为0
		//静态变量的生存期是整个源程序,作用域只是定义它的文件
		//函数被调用时,其中的局部静态变量的值保留前次被调用的结果
	//按值传递的机制
		//给函数传递变元(参数)时,变元(参数)值不会直接传递给参数,而是先制作变元(参数)值的副本,存储在栈上,再使这个副本可用于函数,而不是使用初始值。
	
	//使用数组作为函数参数时1
		//1、数组作为函数实参时,只传递数组的地址(首地址),并不传递整个数组空间
		//2、当用数组名作为实参调用函数时,数组首地址指针被传递到函数中
																									//	/*
																									//	量数组大小:
																									//	double test[] = {1,2,3,4,5,6};
																									//	printf("test数组的元素的个数:%d\n",sizeof(test)/sizeof(test[0]));
																									//	*/
	//使用头文件
		//自定义头文件
			//一般放一些重复使用的代码,例如函数声明、变量声明、常量声明、宏的定义等。
//函数总结
	//根据变量的作用域可以将变量划分为:局部变量和全局变量
	//根据变量的存储类型(决定生存周期)将变量划分为:自动变量、寄存器变量、静态变量、外部变量
		//静态局部变量的生存周期为整个源程序,但其作用域为定义该变量的函数
		//静态全局变量的生存周期为整个源程序,其作用域为定义该变量的源文件
	//传值调用,在被调函数中改变形参值,只是改变其副本值,而不会影响调用函数中实参值
	//采用传址调用方式时,传递的是变量的地址值,这样在被调函数中,对形参的操作实际上操作的是实参本身
	//数组作为参数传递时,实际采用传址方式
	
//字符串
	//字符串
		//1、一个或多个字符的序列
		//2、C语言中形如“My heart is still”
		//3、双引号不是字符串的一部分,仅用来告知编译器括起来的是字符串
	//C语言中的字符串
		//使用字符数组存储:每个存储单元占一个字节,结尾是空字符 \0
//小结
	//字符串由一个或多个字符的序列称为字符串
	//C语言中使用字符数组存储字符串
	//所有的字符串都是字符数组,反之不成立
	//三种方式录入字符串
		//1、scanf("%s",str);
		//2、gets(str);
		//3、fgets(str,50,stdin);
//指向字符串的指针
	//将指针指向字符串
		//可以指向常量字符串
		//也可以指向存储字符串的字符数组
//数组和指针
	//初始化字符数组时会把静态存储区的字符串拷贝到数组中
	//初始化指针时只把字符串的地址拷贝给指针
	
//结构
	//结构是一种构造数据类型
	//注意:1、结构定义并不预留内存。2、结构定义一般放在程序的开始部分(头文件声明之后)。3、结构定义仅用来描述结构的形式,使用结构需要声明结构变量
//指向结构的指针
	//一个指针指向结构时,称为结构指针变量
	//结构指针变量中的值是所指向的结构变量的首地址
	//一般形式:struct 结构名称 *结构指针变量名;
	//访问结构成员的一般方式:
		//1、(*结构指针变量).成员变量名
		//2、结构指针变量 -> 成员变量名
//参数传递小结
	//1、传递结构成员
	//2、传递结构
		//优点:函数处理的是原始数据的副本,保护了原始数据
		//缺点:老版本不支持;传递结构浪费时间和空间
		//一般用来处理小型结构数据
	//3、传递结构的地址
		//优点:程序的执行速度快,效率高
		//缺点:无法保护数据,函数中操作有可能会意外影响原结构中的数据
		//程序员为了追求效率,常用此方案
//总结
	//结构是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员
	//要在程序里使用结构,需要声明结构变量
	//访问结构成员的操作要用圆点运算符(.)
		//一把形式为:结构变量名.成员名
	//可以通过只想结构的指针访问结构成员
		//常见形式为:结构指针变量->成员名。
	//数组元素的类型为结构的数组称为结构数组
	//结构作为函数参数有三种不同的形式:
		//结构成员的值传递给函数参数、整个结构作为参数传递、结构指针变量做函数的参数
//
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
					  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值