做软件赚钱还是做网站赚钱,免费ftp空间,建立制度,搜索引擎优化培训中心1. 简介 C语言是一种通用的编程语言#xff0c;广泛应用于系统编程、嵌入式系统和高性能应用程序。它由Dennis Ritchie在1972年开发#xff0c;并且至今仍然非常流行。C语言以其高效、灵活和强大的功能著称#xff0c;是许多现代编程语言的基础。
2. 基本语法
2.1 Hello, …1. 简介 C语言是一种通用的编程语言广泛应用于系统编程、嵌入式系统和高性能应用程序。它由Dennis Ritchie在1972年开发并且至今仍然非常流行。C语言以其高效、灵活和强大的功能著称是许多现代编程语言的基础。
2. 基本语法
2.1 Hello, World!程序
#include stdio.hint main() {printf(Hello, World!\n);return 0;
}#include stdio.h包含标准输入输出库。int main()程序的主函数。printf输出函数用于打印字符串。return 0返回0表示程序成功结束。
2.2 注释 C语言支持单行注释和多行注释
// 这是单行注释
/*这是多行注释
*/3. 数据类型和变量
3.1 基本数据类型 C语言有以下几种基本数据类型
整型int浮点型float, double字符型char
int a 10;
float b 5.5;
char c A;3.2 变量声明和初始化 变量声明和初始化可以在同一行完成
int x 5;
float y 3.14;
char z A;3.3 常量 使用const关键字定义常量
const int MAX 100;数据类型描述int整型float浮点型double双精度浮点型char字符型const常量
4. 运算符
4.1 算术运算符 C语言支持以下算术运算符
加法-减法*乘法/除法%取模
int a 10, b 3;
int sum a b; // sum 13
int diff a - b; // diff 7
int prod a * b; // prod 30
int quot a / b; // quot 3
int mod a % b; // mod 14.2 关系运算符 关系运算符用于比较两个值
等于!不等于大于小于大于等于小于等于
int x 5, y 10;
int result (x y); // result 0 (false)
result (x ! y); // result 1 (true)
result (x y); // result 0 (false)
result (x y); // result 1 (true)4.3 逻辑运算符 逻辑运算符用于组合多个条件
逻辑与||逻辑或!逻辑非
int a 1, b 0;
int result (a b); // result 0 (false)
result (a || b); // result 1 (true)
result !a; // result 0 (false)4.4 赋值运算符 赋值运算符用于给变量赋值
赋值加后赋值-减后赋值*乘后赋值/除后赋值%模后赋值
int a 10;
a 5; // a 15
a - 3; // a 12
a * 2; // a 24
a / 4; // a 6
a % 4; // a 24.5 位运算符 位运算符用于操作二进制位
按位与|按位或^按位异或~按位取反左移右移
int a 5, b 3; // a 0101, b 0011
int result a b; // result 0001 (1)
result a | b; // result 0111 (7)
result a ^ b; // result 0110 (6)
result ~a; // result 11111111111111111111111111111010 (-6)
result a 1; // result 1010 (10)
result a 1; // result 0010 (2)4.6 其他运算符
? :三元运算符
int a 10, b 20;
int max (a b) ? a : b; // max 20运算符描述, -, *, /, %算术运算符, !, , , , 关系运算符,, , -, *, /, %赋值运算符,, ^, ~, , ? :三元运算符
4.7 综合示例
#include stdio.hint main() {int a 10, b 20;int sum a b;int diff a - b;int prod a * b;int quot a / b;int mod a % b;if (a b) {printf(a is greater than b\n);} else {printf(a is not greater than b\n);}int max (a b) ? a : b;printf(The maximum value is: %d\n, max);return 0;
}5. 控制结构
5.1 条件语句
5.1.1 if语句
int x 5;
if (x 0) {printf(x is positive\n);
}5.1.2 if-else语句
int x -5;
if (x 0) {printf(x is positive\n);
} else {printf(x is non-positive\n);
}5.1.3 switch语句
int day 3;
switch (day) {case 1:printf(Monday\n);break;case 2:printf(Tuesday\n);break;case 3:printf(Wednesday\n);break;default:printf(Invalid day\n);
}
5.2 循环语句 循环语句允许重复执行某段代码直到满足特定条件。C语言支持三种主要的循环语句for循环、while循环和do-while循环。
5.2.1 for循环 for循环通常用于需要明确知道循环次数的场景。
for (int i 0; i 5; i) {printf(i %d\n, i);
}初始化int i 0在循环开始前执行。条件i 5在每次循环前检查如果条件为真则执行循环体。迭代i在每次循环结束后执行。
5.2.2 while循环 while循环在每次迭代前检查条件如果条件为真则执行循环体。
int i 0;
while (i 5) {printf(i %d\n, i);i;
}5.2.3 do-while循环 do-while循环先执行循环体然后再检查条件。如果条件为真则继续循环。
int i 0;
do {printf(i %d\n, i);i;
} while (i 5);循环类型描述for适用于已知循环次数的情况while适用于循环次数不确定但需要在每次迭代前检查条件的情况do-while适用于至少需要执行一次循环体的情况
5.3 跳转语句 跳转语句用于改变程序的执行流程。C语言支持以下跳转语句break、continue和goto。
5.3.1 break break语句用于立即退出循环或switch语句。
for (int i 0; i 10; i) {if (i 5) {break;}printf(i %d\n, i);
}5.3.2 continue continue语句用于跳过当前迭代继续下一次循环。
for (int i 0; i 10; i) {if (i 5) {continue;}printf(i %d\n, i);
}5.3.3 goto goto语句用于无条件跳转到程序中的指定标签。应谨慎使用goto因为它可能导致代码难以理解和维护。
int i 0;
start:
printf(i %d\n, i);
i;
if (i 5) {goto start;
}跳转语句描述break立即退出循环或switch语句continue跳过当前迭代继续下一次循环goto无条件跳转到指定标签
5.4 综合示例
#include stdio.hint main() {// for 循环示例for (int i 0; i 5; i) {printf(for loop: i %d\n, i);}// while 循环示例int j 0;while (j 5) {printf(while loop: j %d\n, j);j;}// do-while 循环示例int k 0;do {printf(do-while loop: k %d\n, k);k;} while (k 5);// break 和 continue 示例for (int l 0; l 10; l) {if (l 5) {break; // 退出循环}if (l % 2 0) {continue; // 跳过当前迭代}printf(break and continue: l %d\n, l);}return 0;
}6. 函数 函数是组织代码的一种方式能够提高代码的重用性和可读性。C语言中的函数包括函数定义和函数声明。
6.1 函数的定义和声明 函数定义包括函数的返回类型、函数名、参数列表和函数体。函数声明则是在函数使用前声明其类型和参数。
// 函数声明
int add(int x, int y);// 函数定义
int add(int x, int y) {return x y;
}int main() {int result add(3, 4);printf(Result: %d\n, result);return 0;
}6.2 函数参数和返回值 函数可以接受参数并返回值。参数在函数定义时指定调用时传递。
int multiply(int a, int b) {return a * b;
}int main() {int result multiply(5, 6);printf(Result: %d\n, result);return 0;
}6.3 递归函数 递归函数是指一个函数在其定义中调用自身。递归需要一个终止条件否则会导致无限递归。
int factorial(int n) {if (n 0) {return 1;}return n * factorial(n - 1);
}int main() {int result factorial(5);printf(Factorial: %d\n, result);return 0;
}6.4 函数指针 函数指针是指向函数的指针可以用来调用函数。
#include stdio.hint add(int a, int b) {return a b;
}int main() {int (*func_ptr)(int, int) add;int result func_ptr(3, 4);printf(Result: %d\n, result);return 0;
}函数类型描述普通函数定义和声明函数接受参数并返回值递归函数在函数定义中调用自身函数指针指向函数的指针用于调用函数
6.5 综合示例
#include stdio.h// 函数声明
int add(int x, int y);
int multiply(int a, int b);
int factorial(int n);// 函数定义
int add(int x, int y) {return x y;
}int multiply(int a, int b) {return a * b;
}int factorial(int n) {if (n 0) {return 1;}return n * factorial(n - 1);
}int main() {int sum add(3, 4);int product multiply(5, 6);int fact factorial(5);printf(Sum: %d\n, sum);printf(Product: %d\n, product);printf(Factorial: %d\n, fact);// 函数指针int (*func_ptr)(int, int) add;int result func_ptr(7, 8);printf(Function pointer result: %d\n, result);return 0;
}
7. 数组 数组是存储相同类型数据的集合。C语言支持一维数组和多维数组。
7.1 一维数组 一维数组是最简单的数组形式用于存储一组相同类型的数据。
int arr[5] {1, 2, 3, 4, 5};
for (int i 0; i 5; i) {printf(arr[%d] %d\n, i, arr[i]);
}7.2 多维数组 多维数组是数组的数组可以用于存储更复杂的数据结构。
int matrix[2][3] {{1, 2, 3},{4, 5, 6}
};for (int i 0; i 2; i) {for (int j 0; j 3; j) {printf(matrix[%d][%d] %d\n, i, j, matrix[i][j]);}
}7.3 字符串字符数组 字符串在C语言中表示为字符数组以空字符\0结尾。
char str[] Hello, World!;
printf(%s\n, str);7.4 数组与指针的关系 数组名实际上是一个指向数组首元素的指针。
int arr[5] {1, 2, 3, 4, 5};
int *p arr; // 数组名即为数组首元素的地址
for (int i 0; i 5; i) {printf(arr[%d] %d, *(p %d) %d\n, i, arr[i], i, *(p i));
}数组类型描述一维数组存储一组相同类型的数据多维数组数组的数组用于存储更复杂的数据结构字符串字符数组以空字符\0结尾数组与指针数组名是指向数组首元素的指针
7.5 综合示例
#include stdio.hint main() {// 一维数组示例int arr[5] {1, 2, 3, 4, 5};for (int i 0; i 5; i) {printf(arr[%d] %d\n, i, arr[i]);}// 多维数组示例int matrix[2][3] {{1, 2, 3},{4, 5, 6}};for (int i 0; i 2; i) {for (int j 0; j 3; j) {printf(matrix[%d][%d] %d\n, i, j, matrix[i][j]);}}// 字符串示例char str[] Hello, World!;printf(%s\n, str);// 数组与指针的关系示例int *p arr; // 数组名即为数组首元素的地址for (int i 0; i 5; i) {printf(arr[%d] %d, *(p %d) %d\n, i, arr[i], i, *(p i));}return 0;
}8. 指针 指针是C语言中非常重要的概念用于存储变量的地址。指针的灵活性和强大功能使其在C语言编程中广泛应用。
8.1 指针的基本概念 指针是一个变量其值为另一个变量的地址。
int a 10;
int *p a; // p是一个指针存储了变量a的地址
printf(a %d, *p %d\n, a, *p); // *p表示指针p指向的变量的值8.2 指针的声明和初始化 指针的声明和初始化如下
int a 10;
int *p a; // 声明一个指向int类型的指针并初始化为变量a的地址8.3 指针运算 指针可以进行加减运算和比较运算。
指针加减运算
int arr[5] {1, 2, 3, 4, 5};
int *p arr;
p p 2; // 指针指向第三个元素
printf(*p %d\n, *p); // 输出3指针比较运算
int *p1 arr;
int *p2 arr 2;
if (p1 p2) {printf(p1 points to an earlier element than p2\n);
}8.4 指针与数组
指针和数组有着密切的关系数组名实际上是一个指向数组首元素的指针。
int arr[5] {1, 2, 3, 4, 5};
int *p arr; // 数组名即为数组首元素的地址
for (int i 0; i 5; i) {printf(arr[%d] %d, *(p %d) %d\n, i, arr[i], i, *(p i));
}8.5 函数中的指针参数
指针可以作为函数参数传递允许函数修改调用者的变量。
void swap(int *a, int *b) {int temp *a;*a *b;*b temp;
}int main() {int x 10, y 20;swap(x, y);printf(x %d, y %d\n, x, y); // 输出x 20, y 10return 0;
}8.6 指向指针的指针
指针不仅可以指向普通变量还可以指向其他指针。
int a 10;
int *p a;
int **pp p; // pp是一个指向指针p的指针
printf(a %d, *p %d, **pp %d\n, a, *p, **pp);8.7 动态内存分配
C语言提供了一组函数用于动态分配和释放内存。
malloc分配指定字节数的内存calloc分配指定数量的内存块并初始化为零realloc重新分配内存free释放内存
#include stdio.h
#include stdlib.hint main() {// 使用malloc分配内存int *arr (int *)malloc(5 * sizeof(int));if (arr NULL) {printf(Memory allocation failed\n);return 1;}for (int i 0; i 5; i) {arr[i] i 1;}for (int i 0; i 5; i) {printf(arr[%d] %d\n, i, arr[i]);}// 释放内存free(arr);return 0;
}指针类型描述普通指针存储变量的地址指向指针的指针存储指针的地址动态内存分配使用malloc, calloc, realloc, free进行内
8.8 综合示例
#include stdio.h
#include stdlib.h// 函数声明
void swap(int *a, int *b);int main() {// 指针基本操作int a 10;int *p a;printf(a %d, *p %d\n, a, *p);// 指针运算int arr[5] {1, 2, 3, 4, 5};p arr;for (int i 0; i 5; i) {printf(arr[%d] %d, *(p %d) %d\n, i, arr[i], i, *(p i));}// 函数中的指针参数int x 10, y 20;swap(x, y);printf(x %d, y %d\n, x, y);// 指向指针的指针int **pp p;printf(a %d, *p %d, **pp %d\n, a, *p, **pp);// 动态内存分配int *dynamicArr (int *)malloc(5 * sizeof(int));if (dynamicArr NULL) {printf(Memory allocation failed\n);return 1;}for (int i 0; i 5; i) {dynamicArr[i] i 1;}for (int i 0; i 5; i) {printf(dynamicArr[%d] %d\n, i, dynamicArr[i]);}free(dynamicArr);return 0;
}void swap(int *a, int *b) {int temp *a;*a *b;*b temp;
}结论 本文详细介绍了C语言的基础知识从基本语法、变量、控制结构、函数、数组一直到指针。通过代码示例和表格总结帮助你更好地理解各个知识点。希望这些内容能够为你打下坚实的基础进一步深入学习C语言。
综合示例
#include stdio.h
#include stdlib.h// 函数声明
// add 函数用于返回两个整数的和
int add(int x, int y);// swap 函数用于交换两个整数的值
void swap(int *a, int *b);// factorial 函数用于计算一个整数的阶乘
int factorial(int n);// printArray 函数用于打印数组的内容
void printArray(int *arr, int size);// initializeMatrix 函数用于初始化一个2x3的矩阵
void initializeMatrix(int matrix[2][3]);int main() {// 基本数据类型和变量int a 10; // 整型变量float b 5.5; // 浮点型变量char c A; // 字符型变量const int MAX 100; // 常量值不可改变// 算术运算符和关系运算符的使用int sum add(a, 5); // 调用 add 函数计算 a 和 5 的和if (sum MAX) { // 使用关系运算符比较 sum 和 MAXprintf(Sum is greater than MAX\n);} else {printf(Sum is less than or equal to MAX\n);}// 逻辑运算符if (a 0 b 0) { // 使用逻辑运算符检查 a 和 b 是否都为正数printf(a and b are positive\n);}// 控制结构// 条件语句if (a 0) { // if 语句检查条件是否为真printf(a is positive\n);} else if (a 0) { // else if 语句检查另一个条件printf(a is zero\n);} else { // else 语句处理所有其他情况printf(a is negative\n);}// switch 语句switch (c) { // 根据变量 c 的值执行相应的 case 语句case A:printf(Character is A\n);break; // break 语句用于退出 switch 语句case B:printf(Character is B\n);break;default: // default 语句处理所有未匹配的情况printf(Character is not A or B\n);}// 循环语句// for 循环for (int i 0; i 5; i) { // for 循环用于重复执行代码块直到条件为假printf(for loop: i %d\n, i);}// while 循环int j 0;while (j 5) { // while 循环在每次迭代前检查条件printf(while loop: j %d\n, j);j;}// do-while 循环int k 0;do { // do-while 循环先执行代码块然后检查条件printf(do-while loop: k %d\n, k);k;} while (k 5);// 跳转语句for (int l 0; l 10; l) {if (l 5) {break; // 退出循环}if (l % 2 0) {continue; // 跳过当前迭代}printf(break and continue: l %d\n, l);}// 数组和指针int arr[5] {1, 2, 3, 4, 5}; // 定义一个包含5个整数的一维数组printArray(arr, 5); // 调用 printArray 函数打印数组内容// 函数中的指针参数int x 10, y 20;swap(x, y); // 调用 swap 函数交换 x 和 y 的值printf(After swap: x %d, y %d\n, x, y);// 递归函数int fact factorial(5); // 调用 factorial 函数计算 5 的阶乘printf(Factorial of 5: %d\n, fact);// 多维数组int matrix[2][3]; // 定义一个2x3的二维数组initializeMatrix(matrix); // 调用 initializeMatrix 函数初始化矩阵for (int i 0; i 2; i) {for (int j 0; j 3; j) {printf(matrix[%d][%d] %d\n, i, j, matrix[i][j]);}}// 字符串char str[] Hello, World!; // 定义一个字符串字符数组printf(%s\n, str);// 动态内存分配int *dynamicArr (int *)malloc(5 * sizeof(int)); // 使用 malloc 分配内存if (dynamicArr NULL) { // 检查内存分配是否成功printf(Memory allocation failed\n);return 1;}for (int i 0; i 5; i) {dynamicArr[i] i 1; // 初始化动态数组}printArray(dynamicArr, 5); // 打印动态数组内容free(dynamicArr); // 释放动态分配的内存return 0;
}// 函数定义
int add(int x, int y) {// 返回两个整数的和return x y;
}void swap(int *a, int *b) {// 交换两个整数的值int temp *a;*a *b;*b temp;
}int factorial(int n) {// 递归计算整数 n 的阶乘if (n 0) {return 1;}return n * factorial(n - 1);
}void printArray(int *arr, int size) {// 打印数组的内容for (int i 0; i size; i) {printf(arr[%d] %d\n, i, arr[i]);}
}void initializeMatrix(int matrix[2][3]) {// 初始化一个2x3的矩阵for (int i 0; i 2; i) {for (int j 0; j 3; j) {matrix[i][j] i * 3 j 1; // 按顺序赋值}}
}