1. C语言的基础知识
1.1 程序的基本结构
C语言程序的基本结构包括:头文件引入、全局变量声明、main函数以及其他函数。
#include <stdio.h>
int global = 100; //全局变量
int main() {
//主函数代码
return 0;
}
void otherFunc(){
//其他函数
}
1.2 数据类型
C语言中有基本数据类型和派生数据类型。基本数据类型包括int、float、double和char等,派生数据类型包括数组、结构体和指针等。
数值类型:在C语言中,int表示整型,float表示单精度浮点数,double表示双精度浮点数。int类型占用4字节的内存空间,范围是-2^31~2^31-1,float类型占用4字节的内存空间,double类型占用8字节的内存空间。
int a = 100; //声明一个int类型的变量a并初始化值为100
float b = 3.14f; //声明一个float类型的变量b并初始化值为3.14
double c = 3.1415; //声明一个double类型的变量c并初始化值为3.1415
1.3 运算符
C语言中有多种运算符,包括算术运算符、关系运算符、逻辑运算符和位运算符等。
算术运算符包括加减乘除和取余等:
int a = 10, b = 5;
int sum = a + b; //加法
int diff = a - b; //减法
int product = a * b; //乘法
int quotient = a / b; //除法
int remainder = a % b; //取余
2. 输入输出
2.1 标准输入输出函数
C语言中,stdio.h头文件中定义了scanf和printf等标准输入输出函数。
scanf从标准输入读取指定格式的数据,可以读取整型、浮点型、字符型等数据,格式控制字符串中需要与数据匹配。
int num;
scanf("%d", &num); //从标准输入读取一个整数,并将其赋值给变量num
printf向标准输出打印指定格式的数据,可以打印整型、浮点型、字符型等数据,格式控制字符串中需要指定打印的类型和格式。
int num = 100;
printf("The value of num is: %d\n", num); //打印变量num的值
2.2 文件输入输出函数
C语言中,stdio.h头文件中还定义了文件输入输出函数,如fopen、fclose、fread、fwrite等。
fopen函数可以打开一个文件,并返回一个指向该文件的指针,常用的模式有“r”表示只读模式、“w”表示只写模式、“a”表示追加模式。
FILE *fp = fopen("test.txt", "w"); //打开文件test.txt,并以只写模式打开
fwrite函数可以将指定长度的二进制数据写入到文件中。
char str[] = "Hello World";
fwrite(str, sizeof(str), 1, fp); //将字符串“Hello World”写入到文件中
3. 函数
3.1 函数定义
在C语言中,可以使用函数来实现模块化编程。一个函数包含函数名、参数列表和函数体三部分,函数名用于唯一标识一个函数,参数列表中包含传递给函数的参数,函数体中包含要执行的代码。
//函数声明
int add(int a, int b);
//函数定义
int add(int a, int b) {
return a + b; //执行加法操作,并返回结果
}
3.2 函数调用
在C语言中,调用函数需要指定函数名和参数列表,并将参数传递给函数。
int a = 10, b = 5;
int result = add(a, b); //调用函数add,并将a和b作为参数传递给函数
3.3 函数指针
在C语言中,函数指针是指向函数的指针变量,可以使用函数指针来动态调用函数。
//函数指针的声明
int (*pFunc)(int, int);
//将函数指针指向函数add
pFunc = add;
//使用函数指针调用函数add
int a = 10, b = 5;
int result = (*pFunc)(a, b);
4. 条件语句和循环语句
4.1 条件语句
C语言中的条件语句包括if语句和switch语句。
if语句用于判断一个条件是否成立,成立则执行一段代码,不成立则跳过代码块。
int a = 10, b = 20;
if (a > b) {
printf("a is greater than b\n");
} else {
printf("a is not greater than b\n");
}
switch语句用于根据不同的情况执行不同的代码块。
int num = 2;
switch(num) {
case 1:
printf("num is 1\n");
break;
case 2:
printf("num is 2\n");
break;
default:
printf("num is not 1 or 2\n");
break;
}
4.2 循环语句
C语言中的循环语句包括while循环、do-while循环和for循环。
while循环在每次循环之前检查条件是否成立,成立则执行循环体中的代码块,然后继续判断条件是否成立,直到条件不成立跳出循环。
int i = 0;
while (i < 10) {
printf("%d\n", i);
i++;
}
do-while循环与while循环类似,只是它先执行一次循环体中的代码块,然后再判断条件是否成立。
int i = 0;
do {
printf("%d\n", i);
i++;
} while (i < 10);
for循环在每次循环之前初始化循环变量,然后判断条件是否成立,成立则执行循环体中的代码块,然后执行循环变量的更新操作。
for (int i = 0; i < 10; i++) {
printf("%d\n", i);
}
5. 指针
5.1 指针变量
C语言中的指针变量用于存储地址,有时也被称为内存地址或者内存指针。通过指针变量可以访问指向的内存地址中存储的数据。
int num = 100;
int *pNum = # //指向变量num的指针
printf("%d\n", *pNum); //输出变量num中存储的内容
5.2 指针和数组
在C语言中,数组名是指向数组首元素的指针,可以使用指针访问数组中的元素。对于数组a来说,a[i]等价于*(a+i)。
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
for (int i = 0; i < 5; i++) {
printf("%d ", *(p+i));
}
6. 结构体
6.1 结构体定义
在C语言中,结构体是一种包含多个变量的复合数据类型。定义结构体变量需要先定义结构体类型。
struct Student {
char name[20];
int age;
float score;
};
struct Student stu = {"Tom", 18, 90.5}; //定义一个结构体变量stu,并初始化
6.2 结构体指针
结构体指针用于存储结构体变量的地址,可以通过指针访问结构体中的成员变量。
struct Student stu = {"Tom", 18, 90.5};
struct Student *pStu = &stu; //定义一个指向结构体的指针
printf("%s, %d, %.2f\n", pStu->name, pStu->age, pStu->score); //使用指针访问结构体成员变量
7. 动态内存分配
7.1 malloc和free函数
C语言中,可以使用malloc函数动态分配内存空间,用完后需要使用free函数释放内存空间。
int *pNum = (int*)malloc(sizeof(int)*10); //动态分配10个int类型的内存空间
free(pNum); //释放内存空间
7.2 常见错误
动态分配内存空间的过程容易出现一些常见的错误,如内存泄漏和内存溢出。
内存泄漏指的是程序中申请的内存空间没有被释放,造成系统资源的浪费。
int *pNum = (int*)malloc(sizeof(int)*10); //申请了内存空间,但未释放
内存溢出指的是程序中申请的内存空间超过系统可用资源的最大限制,导致程序崩溃或者系统出现异常。
int *pNum = (int*)malloc(sizeof(int)*1000000); //申请了过多的内存空间,导致内存溢出
总结
本文详细介绍了C语言中的基础知识,包括程序的基本结构、数据类型、运算符、输入输出、函数、条件语句、循环语句、指针、结构体和动态内存分配等。
C语言作为一种高效且灵活的编程语言,适用于嵌入式设备、操作系统和高性能服务器等领域。掌握C语言的基础知识对于学习C++、Java等其他编程语言也非常有帮助。