跳至主要內容

C高级语言程序设计 笔记📒

课程笔记C语言程序设计约 1187 字大约 4 分钟

C 高级语言程序设计 笔记

一、循环

1.1 for 循环

for (表达式1; 表达式2; 表达式3) {
    语句
}

执行过程:

  1. 求解表达式1(初始化)
  2. 求解表达式2(条件判断),为真则执行语句,为假则结束循环
  3. 求解表达式3(更新)
  4. 转回步骤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)测试长度(不含\0strlen("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+ia+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 链表

  • 根据数据动态开辟内存地址,避免空间浪费
  • 在结构体最后加入指针,指向下一个节点