C/C++复习-- C语言初始基础
C语言初始基础
本文结合代码实例与理论解析,系统讲解C语言的核心知识点,涵盖数据类型、控制结构、函数、指针、结构体等核心内容,并辅以常见错误分析与进阶技巧。通过对比文件一代码与文件二理论,帮助初学者构建完整的C语言知识框架。
一、C语言基础与第一个程序
1. C语言简介
- 定位:通用编程语言,适合底层开发(如操作系统、嵌入式)。
- 特点:高效、跨平台、面向过程。
- 标准:最新标准为C11,支持Unicode字符。
2. 第一个程序:打印"Hello Bit"
#include <stdio.h>
int main() {printf("Hello Bit\n"); // \n为换行符return 0; // 返回值0表示正常退出
}
- 关键点:
main
函数是唯一入口,必须存在且仅有一个。#include <stdio.h>
引入标准输入输出库,支持printf
函数。
二、数据类型与变量详解
1. 基础数据类型
#include <stdio.h>
int main() {printf("char大小: %d字节\n", sizeof(char)); // 1printf("long大小: %d字节\n", sizeof(long)); // 4(32位)或8(64位)printf("double大小: %d字节\n", sizeof(double));// 8return 0;
}
- 类型选择:
int
存储整数(如年龄),float
存储单精度浮点数(如价格)。long
和long long
用于大整数,double
用于高精度计算。
2. 变量与常量
- 变量定义:
int age = 20; // 变量可修改 const float PI = 3.14f; // const修饰的常变量(不可修改) #define MAX 100 // 宏常量(预处理阶段替换)
- 作用域与生命周期:
- 全局变量:整个程序有效,生命周期与程序一致。
- 局部变量:仅在代码块内有效,退出代码块后销毁。
三、控制结构:选择与循环
1. 选择语句(if-else)
#include <stdio.h>
int main() {int input;printf("是否好好学习?(1/0): ");scanf("%d", &input); // 输入赋值给inputif (input == 1) {printf("好offer\n"); // 条件为真执行} else {printf("卖红薯\n"); // 条件为假执行}return 0;
}
- 注意事项:
scanf
需使用&
取变量地址。
2. 循环语句(while)
#include <stdio.h>
int main() {int line = 0;while (line < 20000) { // 循环条件printf("敲代码第%d行\n", line + 1);line++; // 修改循环变量}printf("达成目标,获得好offer!\n");return 0;
}
- 循环控制:
break
跳出循环,continue
跳过本次循环。
四、函数与数组实战
1. 自定义函数
#include <stdio.h>
int Add(int x, int y) { // 函数定义return x + y;
}
int main() {int sum = Add(10, 20); // 函数调用printf("sum = %d\n", sum); // 输出:30return 0;
}
- 函数优势:代码复用、模块化开发。
2. 数组操作
#include <stdio.h>
int main() {int arr[5] = {1, 2, 3, 4, 5};for (int i = 0; i < 5; i++) {printf("%d ", arr[i]); // 输出:1 2 3 4 5}return 0;
}
- 关键点:
- 数组下标从0开始,访问越界会导致未定义行为。
- 字符串数组需以
\0
结尾,否则可能打印乱码(见下文错误分析)。
五、指针与内存管理
1. 指针基础
#include <stdio.h>
int main() {int num = 10;int *p = # // 定义指针并指向num的地址*p = 20; // 通过指针修改值printf("num = %d\n", num); // 输出:20return 0;
}
- 核心概念:
&
取地址,*
解引用。- 指针大小:32位系统为4字节,64位系统为8字节。
2. 指针与数组
#include <stdio.h>
int main() {int arr[3] = {10, 20, 30};int *p = arr; // 数组名即首元素地址printf("第二个元素:%d\n", *(p + 1)); // 输出:20return 0;
}
六、结构体与高级特性
1. 结构体定义
#include <stdio.h>
struct Student {char name[20];int age;float score;
};
int main() {struct Student s = {"张三", 18, 95.5};printf("姓名:%s,年龄:%d,分数:%.1f\n", s.name, s.age, s.score);return 0;
}
- 结构体指针:
struct Student *ps = &s; printf("姓名:%s\n", ps->name); // ->操作符访问成员
2. 枚举常量(enum)
#include <stdio.h>
enum Week { Mon=1, Tue, Wed }; // 默认从0开始,此处Mon=1
int main() {printf("周一:%d\n", Mon); // 输出:1printf("周二:%d\n", Tue); // 输出:2return 0;
}
七、常见错误与调试技巧
1. 格式化输出错误
long num = 100;
printf("%d\n", num); // 错误!应使用%ld
- 修正:
printf("%ld\n", num);
2. 字符串缺失结束符
char arr[] = {'a', 'b', 'c'};
printf("%s\n", arr); // 可能输出乱码(缺少\0)
- 修正:
char arr[] = {'a', 'b', 'c', '\0'};
3. 未初始化指针
int *p; // 野指针
*p = 10; // 导致程序崩溃
- 修正:始终初始化指针,如
int *p = NULL;
八、进阶技巧与总结
1. 宏定义与条件编译
#define DEBUG 1
#if DEBUGprintf("调试模式\n"); // 根据DEBUG值控制代码块
#endif
2. static关键字
- 修饰局部变量:延长生命周期至程序结束。
- 修饰全局变量/函数:限制作用域为当前文件。
void test() {static int count = 0; // 仅初始化一次count++;printf("调用次数:%d\n", count);
}
3. 总结
- 核心重点:理解数据类型、内存管理和指针。
- 学习建议:多实践,使用调试工具(如GDB),阅读经典代码(如Linux内核片段)。
通过本文,读者可系统掌握C语言的核心语法与实战技巧。建议结合代码示例动手编写程序,逐步深入理解底层机制。