目录C语言基础1.1 数据类型与变量1.2 运算符与表达式1.3 控制结构函数与程序结构1. 函数定义与调用1.2 预处理指令1.3 链接与编译指针与内存管理1. 指针的概念与使用1.2 动态内存分配...
C语言支持多种数据类型,包括基本数据类型(int、float、double等)和复合数据类型(数组、指针等)。以下是一些基本数据类型及其占用的内存空间:
| 数据类型 | 描述 | 内存占用(字节) |
|---|---|---|
| int | 整数 | 4(通常) |
| float | 单精度浮点数 | 4 |
| double | 双精度浮点数 | 8 |
| char | 字符 | 1 |
定义变量的语法为:
数据类型 变量名;例如:
int num;
float fnum;
char ch;C语言提供了丰富的运算符,包括算术运算符、关系运算符、逻辑运算符等。以下是一些常用运算符:
| 运算符 | 描述 | 例子 |
|---|---|---|
| + | 加法 | 2 + 3 |
| - | 减法 | 5 - 2 |
| * | 乘法 | 4 * 6 |
| / | 除法 | 8 / 2 |
| % | 取模 | 10 % 3 |
| == | 等于 | 5 == 5 |
| != | 不等于 | 4 != 5 |
| > | 大于 | 6 > 3 |
| < | 小于 | 2 < 5 |
| >= | 大于等于 | 5 >= 3 |
| <= | 小于等于 | 4 <= 5 |
| && | 与 | (2 > 1) && (3 > 2) |
| 或 | ||
| ! | 非运算 | !(5 == 5) |
C语言中的控制结构包括条件语句、循环语句和跳转语句。
if (条件表达式) { // 条件为真时执行的代码
} else { // 条件为假时执行的代码
}for (初始化表达式; 条件表达式; 更新表达式) { // 循环体
}while (条件表达式) { // 循环体
}do { // 循环体
} while (条件表达式);用于跳出循环或 switch 语句。
用于跳过当前循环的剩余部分,继续执行下一个循环。
用于从函数中返回,并可选地返回一个值。
函数是 C 语言中的核心概念之一,它允许将代码块组织成可重用的单元。以下是一个简单的函数定义与调用示例:
// 函数声明
void sayHello();
// 函数定义
void sayHello() { printf("Hello, world!\n");
}
// 主函数
int main() { // 函数调用 sayHello(); return 0;
}预处理指令是 C 语言编译器在编译代码之前执行的指令。以下是一些常用的预处理指令:
#define 宏名 替换文本
#include "文件名"
#ifdef 宏名 // 宏定义相关代码
#endifC 语言程序通常由多个源文件组成。编译器将每个源文件编译成目标文件,然后通过链接器将这些目标文件链接成可执行文件。以下是一个简单的编译和链接过程:
gcc -o 程序名 源文件1.c 源文件2.c指针是 C 语言中的另一个核心概念,它指向内存中的某个地址。以下是一个简单的指针示例:
int num = 10;
int *ptr = #
printf("num = %d, *ptr = %d\n", num, *ptr);动态内存分配允许在程序运行时分配内存。以下是一些常用的动态内存分配函数:
void *malloc(size_t size);
void *calloc(size_t num, size_t size);
void *realloc(void *ptr, size_t size);
void free(void *ptr);内存泄漏是指程序中未释放的内存,这会导致内存浪费和性能下降。以下是一些预防内存泄漏的措施:
malloc 或 calloc 调用都对应一个 free 调用。std::unique_ptr)自动管理内存。数组是 C 语言中的一种复合数据类型,它允许存储一系列相同类型的数据。以下是一个一维数组的示例:
int arr[5] = {1, 2, 3, 4, 5};
printf("arr[2] = %d\n", arr[2]);C 语言标准库提供了许多用于字符串操作的函数,例如:
char *strcpy(char *dest, const char *src);
char *strcat(char *dest, const char *src);
int strlen(const char *str);以下是一些字符串处理的示例:
#include
int main() { char str1[50] = "Hello, "; char str2[] = "world!"; char *result = malloc(strlen(str1) + strlen(str2) + 1); strcpy(result, str1); strcat(result, str2); printf("Result: %s\n", result); free(result); return 0;
} 结构体允许将不同类型的数据组合在一起。以下是一个结构体的示例:
struct person { char name[50]; int age; float height;
};联合体允许存储多个数据类型在同一个内存位置,而枚举则用于定义一组命名的整数值。以下是一些示例:
union data { int i; float f; char c[10];
};
enum color { RED, GREEN, BLUE
};文件是存储在磁盘上的数据集合。以下是一些常用的文件操作函数:
FILE *fopen(const char *filename, const char *mode);
int fclose(FILE *stream);
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream);以下是一些文件读写操作的示例:
#include
int main() { FILE *fp = fopen("example.txt", "r"); if (fp == NULL) { perror("Error opening file"); return 1; } char buffer[100]; while (fgets(buffer, sizeof(buffer), fp)) { printf("%s", buffer); } fclose(fp); return 0;
} 输入输出重定向允许将输入和输出连接到文件或其他设备。以下是一些示例:
./program < input.txt > output.txt编译器是将高级语言代码转换为机器语言的程序。常见的 C 编译器包括 GCC、Clang 和 MSVC。
调试工具可以帮助您找到程序中的错误。常见的调试工具包括 GDB、LLDB 和 Visual Studio 的调试器。
以下是一个简单的计算器程序,它使用函数实现加、减、乘、除运算:
#include
int add(int a, int b) { return a + b;
}
int subtract(int a, int b) { return a - b;
}
int multiply(int a, int b) { return a * b;
}
int divide(int a, int b) { if (b != 0) { return a / b; } else { return 0; }
}
int main() { int a, b; char operator; printf("Enter an operator (+, -, *, /): "); scanf("%c", &operator); printf("Enter two operands: "); scanf("%d %d", &a, &b); switch (operator) { case '+': printf("%d + %d = %d\n", a, b, add(a, b)); break; case '-': printf("%d - %d = %d\n", a, b, subtract(a, b)); break; case '*': printf("%d * %d = %d\n", a, b, multiply(a, b)); break; case '/': printf("%d / %d = %d\n", a, b, divide(a, b)); break; default: printf("Invalid operator!\n"); break; } return 0;
} 以下是一个猜数字游戏的示例,该游戏生成一个随机数,并让用户尝试猜测:
#include
#include
#include
int main() { int number, guess; srand(time(NULL)); number = rand() % 100 + 1; printf("Guess the number between 1 and 100: "); scanf("%d", &guess); while (guess != number) { if (guess < number) { printf("Lower! Try again: "); } else { printf("Higher! Try again: "); } scanf("%d", &guess); } printf("Congratulations! You guessed the number: %d\n", number); return 0;
} 以下是一个简单的字符串匹配算法,它使用 KMP 算法进行匹配:
#include
#include
void computeLPSArray(char* pat, int M, int* lps) { int length = 0; int i = 1; lps[0] = 0; // lps[0] is always 0 while (i < M) { if (pat[i] == pat[length]) { length++; lps[i] = length; i++; } else { if (length != 0) { length = lps[length - 1]; } else { lps[i] = 0; i++; } } }
}
void KMPSearch(char* pat, char* txt) { int M = strlen(pat); int N = strlen(txt); int lps[M]; computeLPSArray(pat, M, lps); int i = 0; // index for txt[] int j = 0; // index for pat[] while (i < N) { if (pat[j] == txt[i]) { j++; i++; } if (j == M) { printf("Found pattern at index %d\n", i - j); j = lps[j - 1]; } else if (i < N && pat[j] != txt[i]) { if (j != 0) j = lps[j - 1]; else i = i + 1; } }
}
int main() { char txt[] = "ABABDABACDABABCABAB"; char pat[] = "ABABCABAB"; KMPSearch(pat, txt); return 0;
} 通过以上内容,您应该对 C 语言编程有了更深入的了解。希望这份宝典能帮助您在 C 语言编程的道路上越走越远!