Plane0799

导航

C语言学习笔记

C语言学习笔记

注释

单行://疯狂星期四v我50

多行:/疯狂星期四v我50/

标识符

1.最好不超过8位

2.第一个字符必须是字母或下划线(数字开头错误)

3.严格区分大小写

4.不能是C语言关键字

for

赋值: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 :类型限定符,用于声明变量为“只读”,即变量的值在初始化后不可被修改,能提升代码安全性和可读性。

常见用法有三种

  1. 修饰普通变量(如 const int a = 5;);
  2. 修饰指针(分指向常量的指针和指针常量,核心区别是“谁不能变”);
  3. 修饰函数参数或返回值(限制参数修改或确保返回值不可被篡改)。

动态内存分布

使用案例:

  1. 申请单个int类型的动态内存(4字节,视编译器而定):
    int* p1 = (int)malloc(sizeof(int)); // 强制类型转换为int
    if (p1 != NULL) { // 务必检查申请是否成功
    *p1 = 10;
    printf("单个动态内存值:%d\n", *p1);
    free(p1); // 释放内存,避免泄漏
    p1 = NULL;
    }// 指针置空,防止野指针

  2. 申请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)    收藏  举报