**编程基础学习(二)-C语言变量、控制结构和函数
一、环境配置与第一个程序
安装编译器
# Ubuntu/Debian
sudo apt-get install gcc# CentOS/RHEL
sudo yum install gcc# macOS
brew install gcc# Windows
# 安装MinGW或使用Visual Studio
第一个C程序
#include <stdio.h>int main() {printf("Hello, World!\n");return 0;
}
编译和运行
gcc hello.c -o hello
./hello
二、基本语法
注释
// 单行注释/*
多行注释
可以跨越多行
*/
变量声明
#include <stdio.h>int main() {int age = 25; // 整型变量float salary = 5000.50; // 浮点型变量char grade = 'A'; // 字符型变量printf("Age: %d\n", age);printf("Salary: %.2f\n", salary);printf("Grade: %c\n", grade);return 0;
}
三、数据类型
基本数据类型
#include <stdio.h>
#include <limits.h>int main() {// 整型int integer = 100;short short_int = 32767;long long_int = 100000L;// 浮点型float float_num = 3.14159f;double double_num = 3.1415926535;// 字符型char character = 'C';// 布尔型 (C99标准)#include <stdbool.h>bool is_true = true;printf("Integer: %d\n", integer);printf("Float: %.5f\n", float_num);printf("Double: %.10f\n", double_num);printf("Character: %c\n", character);printf("Boolean: %d\n", is_true);return 0;
}
类型转换
#include <stdio.h>int main() {// 隐式类型转换int a = 10;float b = 3.5;float result = a + b; // a被转换为float// 显式类型转换float pi = 3.14159;int integer_pi = (int)pi;printf("Result: %.2f\n", result);printf("Integer PI: %d\n", integer_pi);return 0;
}
四、运算符
算术运算符
#include <stdio.h>int main() {int a = 10, b = 3;printf("a + b = %d\n", a + b); // 加法printf("a - b = %d\n", a - b); // 减法printf("a * b = %d\n", a * b); // 乘法printf("a / b = %d\n", a / b); // 除法printf("a %% b = %d\n", a % b); // 取模// 自增自减int x = 5;printf("x++: %d\n", x++); // 后置自增printf("++x: %d\n", ++x); // 前置自增return 0;
}
关系运算符
#include <stdio.h>int main() {int a = 10, b = 20;printf("a == b: %d\n", a == b); // 等于printf("a != b: %d\n", a != b); // 不等于printf("a > b: %d\n", a > b); // 大于printf("a < b: %d\n", a < b); // 小于printf("a >= b: %d\n", a >= b); // 大于等于printf("a <= b: %d\n", a <= b); // 小于等于return 0;
}
逻辑运算符
#include <stdio.h>int main() {int a = 1, b = 0;printf("a && b: %d\n", a && b); // 逻辑与printf("a || b: %d\n", a || b); // 逻辑或printf("!a: %d\n", !a); // 逻辑非return 0;
}
五、控制结构
条件语句
#include <stdio.h>int main() {int score = 85;// if-else语句if (score >= 90) {printf("Grade: A\n");} else if (score >= 80) {printf("Grade: B\n");} else if (score >= 70) {printf("Grade: C\n");} else {printf("Grade: F\n");}// switch语句char grade = 'B';switch (grade) {case 'A':printf("Excellent!\n");break;case 'B':printf("Good!\n");break;case 'C':printf("Average!\n");break;default:printf("Need improvement!\n");}return 0;
}
循环语句
#include <stdio.h>int main() {int i;// for循环printf("For loop: ");for (i = 0; i < 5; i++) {printf("%d ", i);}printf("\n");// while循环printf("While loop: ");i = 0;while (i < 5) {printf("%d ", i);i++;}printf("\n");// do-while循环printf("Do-while loop: ");i = 0;do {printf("%d ", i);i++;} while (i < 5);printf("\n");// break和continueprintf("Break example: ");for (i = 0; i < 10; i++) {if (i == 5) break;printf("%d ", i);}printf("\n");printf("Continue example: ");for (i = 0; i < 5; i++) {if (i == 2) continue;printf("%d ", i);}printf("\n");return 0;
}
六、函数
函数定义和调用
#include <stdio.h>// 函数声明
int add(int a, int b);
void print_message();// 主函数
int main() {int result = add(5, 3);printf("5 + 3 = %d\n", result);print_message();return 0;
}// 函数定义
int add(int a, int b) {return a + b;
}void print_message() {printf("Hello from function!\n");
}
递归函数
#include <stdio.h>// 递归计算阶乘
int factorial(int n) {if (n <= 1) {return 1;}return n * factorial(n - 1);
}int main() {int num = 5;printf("Factorial of %d is %d\n", num, factorial(num));return 0;
}
七、数组
一维数组
#include <stdio.h>int main() {// 数组声明和初始化int numbers[5] = {1, 2, 3, 4, 5};float grades[3] = {85.5, 90.0, 78.5};// 访问数组元素printf("First number: %d\n", numbers[0]);printf("Third grade: %.1f\n", grades[2]);// 遍历数组printf("All numbers: ");for (int i = 0; i < 5; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;
}
多维数组
#include <stdio.h>int main() {// 二维数组int matrix[2][3] = {{1, 2, 3},{4, 5, 6}};// 访问二维数组printf("Element at [1][2]: %d\n", matrix[1][2]);// 遍历二维数组printf("Matrix:\n");for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {printf("%d ", matrix[i][j]);}printf("\n");}return 0;
}
八、指针
基本指针操作
#include <stdio.h>int main() {int number = 100;int *ptr = &number; // 指针指向number的地址printf("Value of number: %d\n", number);printf("Address of number: %p\n", &number);printf("Value of pointer: %p\n", ptr);printf("Value pointed by pointer: %d\n", *ptr);// 通过指针修改变量值*ptr = 200;printf("New value of number: %d\n", number);return 0;
}
指针与数组
#include <stdio.h>int main() {int arr[5] = {10, 20, 30, 40, 50};int *ptr = arr; // 指向数组首元素printf("Array elements using pointer:\n");for (int i = 0; i < 5; i++) {printf("arr[%d] = %d\n", i, *(ptr + i));}return 0;
}
指针与函数
#include <stdio.h>// 通过指针交换两个变量的值
void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}int main() {int x = 10, y = 20;printf("Before swap: x = %d, y = %d\n", x, y);swap(&x, &y);printf("After swap: x = %d, y = %d\n", x, y);return 0;
}
九、结构体
结构体定义和使用
#include <stdio.h>
#include <string.h>// 定义结构体
struct Student {char name[50];int age;float grade;
};int main() {// 声明结构体变量struct Student student1;// 初始化结构体成员strcpy(student1.name, "张三");student1.age = 20;student1.grade = 88.5;// 访问结构体成员printf("Student Name: %s\n", student1.name);printf("Student Age: %d\n", student1.age);printf("Student Grade: %.1f\n", student1.grade);// 结构体数组struct Student students[3] = {{"李四", 21, 92.0},{"王五", 19, 85.5},{"赵六", 22, 78.0}};printf("\nAll students:\n");for (int i = 0; i < 3; i++) {printf("%s, %d, %.1f\n", students[i].name, students[i].age, students[i].grade);}return 0;
}
结构体与指针
#include <stdio.h>struct Point {int x;int y;
};int main() {struct Point p1 = {10, 20};struct Point *ptr = &p1;// 通过指针访问结构体成员printf("Point coordinates: (%d, %d)\n", ptr->x, ptr->y);// 修改结构体成员ptr->x = 30;ptr->y = 40;printf("New coordinates: (%d, %d)\n", p1.x, p1.y);return 0;
}
十、文件操作
文件读写
#include <stdio.h>int main() {FILE *file;char text[100];// 写入文件file = fopen("example.txt", "w");if (file == NULL) {printf("Error opening file for writing!\n");return 1;}fprintf(file, "Hello, File!\n");fprintf(file, "This is a test file.\n");fclose(file);// 读取文件file = fopen("example.txt", "r");if (file == NULL) {printf("Error opening file for reading!\n");return 1;}printf("File contents:\n");while (fgets(text, sizeof(text), file) != NULL) {printf("%s", text);}fclose(file);return 0;
}
二进制文件操作
#include <stdio.h>struct Data {int id;float value;
};int main() {FILE *file;struct Data data;// 写入二进制数据file = fopen("data.bin", "wb");if (file == NULL) {printf("Error opening binary file for writing!\n");return 1;}struct Data write_data = {1, 3.14};fwrite(&write_data, sizeof(struct Data), 1, file);fclose(file);// 读取二进制数据file = fopen("data.bin", "rb");if (file == NULL) {printf("Error opening binary file for reading!\n");return 1;}fread(&data, sizeof(struct Data), 1, file);printf("Read data: id=%d, value=%.2f\n", data.id, data.value);fclose(file);return 0;
}
十一、内存管理
动态内存分配
#include <stdio.h>
#include <stdlib.h>int main() {int *arr;int n;printf("Enter the size of array: ");scanf("%d", &n);// 动态分配内存arr = (int*)malloc(n * sizeof(int));if (arr == NULL) {printf("Memory allocation failed!\n");return 1;}// 使用动态数组printf("Enter %d integers:\n", n);for (int i = 0; i < n; i++) {scanf("%d", &arr[i]);}printf("You entered: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");// 释放内存free(arr);return 0;
}
其他内存函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {// malloc - 分配未初始化的内存int *ptr1 = (int*)malloc(5 * sizeof(int));// calloc - 分配并初始化为0的内存int *ptr2 = (int*)calloc(5, sizeof(int));// realloc - 重新分配内存ptr1 = (int*)realloc(ptr1, 10 * sizeof(int));printf("calloc initialized to zeros:\n");for (int i = 0; i < 5; i++) {printf("%d ", ptr2[i]);}printf("\n");// 释放内存free(ptr1);free(ptr2);return 0;
}
十二、编译和调试技巧
常用编译选项
# 基本编译
gcc program.c -o program# 显示所有警告
gcc -Wall program.c -o program# 调试信息
gcc -g program.c -o program# 优化级别
gcc -O2 program.c -o program# 指定标准
gcc -std=c99 program.c -o program
预处理指令
#include <stdio.h>
#define PI 3.14159
#define MAX(a, b) ((a) > (b) ? (a) : (b))int main() {printf("PI = %.5f\n", PI);printf("MAX(10, 20) = %d\n", MAX(10, 20));#ifdef DEBUGprintf("Debug mode enabled\n");#endifreturn 0;
}
总结:这份C语言基础指南涵盖了从基本语法到高级特性的核心概念,包括变量、控制结构、函数、指针、结构体、文件操作和内存管理。掌握这些基础知识是学习更高级C语言编程和系统开发的必要条件。