C语言学习笔记
C语言学习笔记
注释
单行://疯狂星期四v我50
多行:/疯狂星期四v我50/
标识符
1.最好不超过8位
2.第一个字符必须是字母或下划线(数字开头错误)
3.严格区分大小写
4.不能是C语言关键字
赋值:int 变量名 = 值(不允许连续赋值)
输出:printf
输入(录入数据):scanf
基本数据类型
char 字符型
int 整型
float 浮点型
double 双精度浮点型
格式化输出
%d 带符号十进制整数
%c 单个字符
%s 字符串
%f 6位小数
定义常量:
define 常量名 常量值
*符号常量一般习惯大写字母,变量习惯小写字母。
自动类型转换
char—>int—>double且char—>double
强制类型转换
(数据类型)(表达式)
eg:
double v50 = 50.0;//若输出结果为50.0
int vme50 = (int)v50;//强制转换为int类型,若输出结果为50
自增/自减(易混淆!)
功能:均自增/自减1
++a/--a:先运算再取值,返回新值++
++a++/a--:先取值再运算,返回原值
运算符及优先级
1 ()
2 +(正号)-(负号)++(自增)--(自减)
3 * / %(求余号)
4 + -(加减号)
5 < <= > >=(比较运算符)
6 == !=(比较运算符,等于/不等于)
7 &&(逻辑运算符,and)
8 ||(逻辑运算符,or)
9 运算式1?运算式2:运算式3(判断语句,先判断1是否正确,正确输出式2,否则输出式3)
10 = += -= *= /= %=(赋值运算符)
分支结构
简单:
if,else
eg:
if(表达式)//无需加分号
{ 执行代码块;}
else //也无需加分号
{执行代码块2;}
多重:
if、else if …… else
嵌套:
if内套if、else
switch语句:
switch(表达式){case 1:执行;break;……case n:执行;break;default:执行;break;}
循环结构
while循环
whlie(表达式)
{执行代码块}
do-while循环
do{执行代码块}
while(表达式);//注意分号
for循环
for(表达式1;表达式2;表达式3)
{执行代码块}
表达式1:赋值 表达式2:判断 表达式3:步进值
/*第一步:执行1,初始化循环变量;
第二步:判断2,为真则执行for循环内循环代码块并向下执行,为假则结束循环;
第三步:执行3;
第四步:执行for循环内执行代码块后执行第二步;
第五步:结束循环 */
三种循环比较:
1、在知道循环次数的情况下更适合使用for循环;
2、在不知道循环次数的情况下适合使用while或者do-while循环,如果有可能一次都不循环应考虑使用while循环,如果至少循环一次应考虑使用do-while循环。
结束语句
break:跳出当前整个循环
continue:结束本次开启下一次循环
论外:goto语句
goto 语句标号;(转义到语句标号所在位置继续执行)
自创函数
数据类型说明+函数名称+(参数)
执行代码块;
返回(表达式);
调用:函数名+(参数);
形参和实参
函数的参数分为形参和实参两种:形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数;实参是在调用时传递该函数的参数。
返回值
函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。
递归:自我调用且有完成状态。
局部变量与全局变量——
一者作用域只在复合语句范围内,一者作用域在于整个源程序。
变量存储类别
静态存储方式:静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。
动态存储方式:动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。
四类存储类别:自动(auto),静态(static),寄存器的(register)和外部的(extern)。
数组
初始化:1、 数据类型 数组名称[长度n] = {元素1,元素2…元素n};
2、 数据类型 数组名称[] = {元素1,元素2…元素n};
3、 数据类型 数组名称[长度n]; 数组名称[0] = 元素1; 数组名称[1] = 元素2; 数组名称[n-1] = 元素n;
注:在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不确定。
「应用」
排序:相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序。
定义字符串:char 字符串名称[长度]="字符串值";或char 字符串名称[长度]={''字符1','2',...,'n',\0'};
多维数组
定义:数组名称 [常量表达式1][常量表达式2]...[常量表达式n];
初始化:1、数据类型 数组名称 [常量表达式1][常量表达式2]...[常量表达式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
2、数据类型 数组名称 [常量表达式1][常量表达式2]...[常量表达式n]; 数组名称[下标1][下标2]...[下标n] = 值;
注意事项:1、采用第一种初始化时数组声明必须指定列的维数。因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数;
2、采用第二种初始化时数组声明必须同时指定行和列的维数。
指针
定义:存储内存地址的变量
*格式:数据类型 指针名
取值:*指针名表示“访问指针指向地址里的内容”,是指针的核心操作。
取地址(&):&变量名获取变量的内存地址,用于给指针赋值。
操作数组:数组名是指向首元素的常量指针,arr[i]等价于*(arr+i),指针±整数可高效遍历数组。
动态内存:配合malloc/free管理动态内存(程序运行中按需申请/释放内存)
eg:int p = (int)malloc(5*sizeof(int))(申请能存5个int的内存,p指向这片内存首地址)。
避免野指针:未初始化(如int *p; p=5)、指向的内存已释放(如free(p)后仍用p)的指针,会导致程序崩溃。——一定要初始化!!
空指针(NULL):给未使用的指针赋NULL(int *p=NULL),表示不指向任何内存,可通过if(p!=NULL)规避非法访问。
sizeof:用于计算变量、数据类型或表达式在内存中所占的字节数,返回值为无符号整数。
基本用法:
sizeof(数据类型)(如 sizeof(int))
sizeof(变量/表达式)(如 sizeof(a) 或 sizeof(3+5))
const :类型限定符,用于声明变量为“只读”,即变量的值在初始化后不可被修改,能提升代码安全性和可读性。
常见用法有三种
- 修饰普通变量(如 const int a = 5;);
- 修饰指针(分指向常量的指针和指针常量,核心区别是“谁不能变”);
- 修饰函数参数或返回值(限制参数修改或确保返回值不可被篡改)。
动态内存分布
使用案例:
-
申请单个int类型的动态内存(4字节,视编译器而定):
int* p1 = (int)malloc(sizeof(int)); // 强制类型转换为int
if (p1 != NULL) { // 务必检查申请是否成功
*p1 = 10;
printf("单个动态内存值:%d\n", *p1);
free(p1); // 释放内存,避免泄漏
p1 = NULL;
}// 指针置空,防止野指针 -
申请int数组的动态内存(5个元素,共20字节):
int* arr = (int*)malloc(5 * sizeof(int));
if (arr != NULL) {
for (int i = 0; i < 5; i++) {
arr[i] = i * 2; // 给数组赋值
printf("数组元素[%d]:%d ", i, arr[i]);
}
free(arr); // 释放数组内存
arr = NULL;
}
字符串
strlen(const char *str):
计算字符串长度,仅统计'\0'(字符串结束符)之前的字符个数,不包含'\0'本身。
strcpy(char *dest, const char *src):
字符串拷贝,将src指向的字符串(含'\0')完整复制到dest指向的空间,需确保dest容量足够,否则会内存溢出。
strcmp(const char *str1, const char *str2):字符串比较,按ASCII码值逐字符对比——
◦ 若str1 == str2,返回0;
◦ 若str1 > str2(首个不同字符ASCII值更大),返回正数;
◦ 若str1 < str2,返回负数。
strrchr(const char *str, int c):
反向查找字符,在str中从右到左查找首次出现字符c的位置,找到返回该位置指针,未找到返回NULL。
struct (结构体):
是一种自定义复合数据类型,核心作用是将多个不同类型的变量(如int、char、指针等)封装成一个整体,用于描述一个具有多个属性的对象(比如学生、书籍、商品等)。
格式:struct 结构体名 { 成员1类型 成员1名; 成员2类型 成员2名; ... };
宏定义
宏定义是C/C++等语言中用#define指令创建的“代码替换规则”,编译前会将代码中所有宏名原样替换成宏体,本质是“文本替换”而非函数或变量。
1. 无参宏:最简单的替换,常用来定义常量,避免硬编码。比如#define PI 3.14159,代码中写PI,编译前会自动换成3.14159。
2. 带参宏:类似“简易函数”但无调用开销,替换时会代入参数。比如#define ADD(a,b) a+b,写ADD(2,3)会直接换成2+3,但要注意加括号避免运算优先级坑(如ADD(2+3,4)会变成2+3+4,若宏体写(a)+(b)更安全)。
项目
•在Dev C++中新建一个项目,然后把几个源代码文件加入进去。
•对于项目,Dev C++的编译会把一个项目中所有的源代码文件都编译后,链接起来。
•有的IDE有分开的编译和构建两个按钮,前者是对单个源代码文件编译,后者是对整个项目做链接。
编译单元
•一个.c文件是一个编译单元。
•编译器每次编译只处理一个编译单元。
头文件
(以.h结尾)函数原型
在需要调用这个函数的源代码文件(.c文件)中井include头文件,使编译器在编译时知道函数原型。
include
“ ”:自己的头文件
< >: 标准库头文件
函数前+static:只能在所在编译单元中被使用的函数(全局变量前+static:只能在所在编译单元中被使用的全局变量)
前加entern:声明,不产生代码
int等:定义,产生代码
posted on 2025-11-07 16:58 Plane_0799 阅读(0) 评论(0) 收藏 举报
浙公网安备 33010602011771号