C高级语言程序设计 笔记📒
课程笔记C语言约 1187 字大约 4 分钟
C 高级语言程序设计 笔记
一、循环
1.1 for 循环
for (表达式1; 表达式2; 表达式3) {
语句
}
执行过程:
- 求解表达式1(初始化)
- 求解表达式2(条件判断),为真则执行语句,为假则结束循环
- 求解表达式3(更新)
- 转回步骤2继续执行
for (循环变量赋初值; 循环条件; 循环变量增值) {
// 循环体
}
二、数组
2.1 一维数组
int a[10]; // 数组名a,有10个元素,下标从0开始
初始化规则:
- 可以全部赋值:
int a[5] = {0, 1, 2, 3, 4}; - 可以部分赋值,未赋值的元素为0
- 全部赋值时可省略长度:
int a[] = {0, 1, 2, 3, 4};
⚠️ 定义数组下标必须使用常量,引用数组时下标可以是变量或表达式
2.2 二维数组
数组名[常量表达式1][常量表达式2]
int a[3][4] = {{1}, {5}, {9}}; // 部分赋值
2.3 字符数组
char c[10] = {'w', 'e', 'e'};
- 缺少的部分自动补全为
\0 - 使用
%c输入输出单个字符
字符串定义:
char c[] = {"china"};
printf("%s", c); // 使用 %s 输出,遇到 \0 结束
输入注意事项:
- 输入字符串时,保留多一位给
\0 - 输入项为字符数组名时,不需要加地址符
&
scanf("%s", Str); // 正确
scanf("%s", &Str); // 错误!
包含空格的字符串:
scanf只会输入空格之前的内容- 若要输入包含空格的字符串,需使用
gets()或其他方法
2.4 字符串处理函数(string.h)
| 函数 | 功能 | 示例 |
|---|---|---|
puts(字符数组) | 输出字符串并自动换行 | puts("hello") |
gets(字符数组) | 输入字符串 | gets(str) |
strcat(s1, s2) | 字符串连接 | 将s2连接到s1之后 |
strcpy(s1, s2) | 字符串复制 | 将s2复制到s1 |
strcmp(s1, s2) | 字符串比较 | 返回ASCII码差值 |
strlen(str) | 测试长度(不含\0) | strlen("abc") = 3 |
strlwr(str) | 转小写 | |
strupr(str) | 转大写 |
三、函数
3.1 函数定义
类型标识符 函数名(形式参数列表) {
声明部分;
语句;
}
- 有参函数:与其他函数之间存在数据传递
- 无参函数:只执行一组操作,可以有或没有返回值
- 使用
void定义的函数没有返回值
3.2 函数调用
- 作为语句调用:
printf("hello"); - 作为表达式:
int result = max(a, b); - 作为实参:
printf("%d", max(a, b));
⚠️ 如果被调用函数定义在后面,需要提前声明函数原型
3.3 参数传递
形式参数 vs 实际参数:
- 只有发生函数调用时,形参才被分配内存单元
- 实参可以是常量、变量或表达式
- 实参与形参类型应相同或赋值相容
- 数据传递是"值传递"(拷贝),只能由实参传给形参
3.4 数组作为函数参数
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
}
⚠️ 主调函数和被调用函数中应分别定义数组,且形式应一致
四、指针
4.1 基本概念
- 指针:值为内存地址的变量
- 指针变量:存储其他变量地址的变量
4.2 定义指针
类型名 *指针变量名;
int *pi; // 指向int类型变量的指针
char *pc; // 指向char类型变量的指针
float *pf, *pg; // pf、pg都是指向float的指针
⚠️ 指针变量前的
*表示类型为指针,变量名不包括*
4.3 指针操作
ptr = &pooh; // 把pooh的地址赋给ptr
val = *ptr; // 取出ptr指向的值(解引用)
等价关系:
ptr = &bah;
val = *ptr;
// 等价于:val = bah;
4.4 指针与数组
- 数组的指针就是数组的地址
p指向数组元素,p+1指向下一个元素p+i和a+i都是a[i]的地址(p+i)或(a+i)就是a[i]
4.5 函数指针
int (*p)(int, int); // 定义函数指针
p = max; // 指向max函数
int result = (*p)(a, b); // 通过指针调用函数
五、结构体
5.1 结构体声明
struct 结构体名 {
类型名 成员名1;
类型名 成员名2;
};
5.2 使用
struct Student {
char name[20];
int age;
};
struct Student s1 = {"Tom", 20};
printf("%s", s1.name); // 访问成员
5.3 typedef
typedef struct {
int month;
int day;
int year;
} DATE;
DATE birthday; // 使用新类型名
DATE *p; // 指针
5.4 链表
- 根据数据动态开辟内存地址,避免空间浪费
- 在结构体最后加入指针,指向下一个节点