每日一个C语言知识:C 变量
C语言变量详解
1. 什么是变量?
变量是程序中用于存储数据的内存位置。你可以把变量想象成一个有名字的盒子,里面可以存放各种类型的数据。
变量的三个基本属性:
- 名称:标识变量的唯一标识符
- 类型:决定变量存储什么类型的数据
- 值:变量中存储的具体数据
2. 变量的声明与定义
变量声明
告诉编译器变量的名称和类型,但不分配内存。
// 声明变量(不分配内存)
extern int external_var; // 告诉编译器这个变量在其他文件中定义
变量定义
声明变量并分配内存。
// 定义变量(分配内存)
int age;
float salary;
char grade;
实际编程中,我们通常直接定义变量。
3. 变量的命名规则
必须遵守的规则:
- 由字母、数字和下划线组成
- 不能以数字开头
- 区分大小写
- 不能使用C语言关键字
良好的命名习惯:
- 使用有意义的名称
- 采用驼峰命名法或下划线分隔
- 避免使用单个字符(除了循环变量)
#include <stdio.h>int main() {// ✅ 良好的变量名int student_age;float account_balance;char first_initial;int numberOfStudents; // 驼峰命名法// ✅ 可接受的简单情况int i, j, k; // 循环变量int x, y; // 坐标// ❌ 不好的变量名int a; // 无意义int 2nd_value; // 以数字开头int float; // 使用关键字return 0;
}
4. 变量的初始化
变量可以在定义时或定义后初始化。
#include <stdio.h>int main() {// 方式1:定义时初始化int age = 25;float height = 175.5;char grade = 'A';// 方式2:先定义后初始化int score;score = 95;// 方式3:同时初始化多个变量int x = 10, y = 20, z = 30;// 未初始化的变量包含垃圾值!int garbage; // 危险:值不确定printf("年龄: %d\n", age);printf("身高: %.1f\n", height);printf("成绩: %c\n", grade);printf("分数: %d\n", score);// 注意:不要使用未初始化的变量// printf("垃圾值: %d\n", garbage); // 危险!return 0;
}
5. 变量的作用域
变量的作用域决定了在程序的哪些部分可以访问该变量。
局部变量
在函数或代码块内部定义的变量。
#include <stdio.h>void testFunction() {int local_var = 10; // 局部变量printf("函数内 local_var = %d\n", local_var);{ // 代码块开始int block_var = 20; // 块级局部变量printf("代码块内 block_var = %d\n", block_var);} // 代码块结束// printf("block_var = %d\n", block_var); // ❌ 错误:block_var在此不可见
}int main() {testFunction();// printf("local_var = %d\n", local_var); // ❌ 错误:local_var在此不可见return 0;
}
全局变量
在所有函数外部定义的变量。
#include <stdio.h>// 全局变量
int global_count = 0;void increment() {global_count++;printf("increment: global_count = %d\n", global_count);
}void decrement() {global_count--;printf("decrement: global_count = %d\n", global_count);
}int main() {printf("初始值: global_count = %d\n", global_count);increment();increment();decrement();printf("最终值: global_count = %d\n", global_count);return 0;
}
形式参数
函数定义中的参数。
#include <stdio.h>// a和b是形式参数
int add(int a, int b) {return a + b;
}int main() {int result = add(5, 3); // 5和3是实际参数printf("结果: %d\n", result);return 0;
}
6. 变量的存储类别
auto(自动变量)
默认的存储类别,在函数内部定义。
#include <stdio.h>void demo_auto() {auto int x = 10; // auto可省略int y = 20; // 等价于 auto int y = 20;printf("x = %d, y = %d\n", x, y);
}
static(静态变量)
在程序整个生命周期内存在,但作用域不变。
#include <stdio.h>void counter() {static int count = 0; // 只初始化一次count++;printf("调用次数: %d\n", count);
}int main() {counter(); // 输出: 调用次数: 1counter(); // 输出: 调用次数: 2counter(); // 输出: 调用次数: 3return 0;
}
register(寄存器变量)
建议编译器将变量存储在寄存器中(编译器可能忽略)。
#include <stdio.h>int main() {register int i; // 建议将i存储在寄存器中for(i = 0; i < 1000; i++) {// 频繁使用的循环变量适合用register}return 0;
}
extern(外部变量)
声明在其他文件中定义的变量。
file1.c:
#include <stdio.h>int global_var = 100; // 全局变量定义void print_global() {printf("global_var = %d\n", global_var);
}
file2.c:
#include <stdio.h>extern int global_var; // 声明外部变量void modify_global() {global_var = 200;printf("修改后 global_var = %d\n", global_var);
}
7. 常量变量
使用 const
关键字定义不可修改的变量。
#include <stdio.h>int main() {// 常量变量const float PI = 3.14159;const int MAX_SIZE = 100;const char NEWLINE = '\n';printf("PI = %.5f%c", PI, NEWLINE);printf("MAX_SIZE = %d%c", MAX_SIZE, NEWLINE);// PI = 3.14; // ❌ 错误:不能修改常量// 常量指针int x = 10, y = 20;const int *ptr = &x; // 指向常量的指针printf("指针指向的值: %d\n", *ptr);// *ptr = 30; // ❌ 错误:不能通过指针修改值ptr = &y; // ✅ 正确:可以改变指针的指向return 0;
}
8. 变量使用的最佳实践
示例:学生成绩管理系统
#include <stdio.h>// 全局常量
const int MAX_STUDENTS = 50;
const float PASSING_GRADE = 60.0;// 全局变量
int student_count = 0;void add_student(float *scores, int *count) {if (*count >= MAX_STUDENTS) {printf("错误:已达到最大学生数!\n");return;}float score;printf("请输入学生分数: ");scanf("%f", &score);scores[*count] = score;(*count)++;student_count = *count;printf("成功添加学生!当前总数: %d\n", student_count);
}void display_statistics(float *scores, int count) {if (count == 0) {printf("暂无学生数据!\n");return;}float sum = 0, average;int pass_count = 0;for(int i = 0; i < count; i++) {sum += scores[i];if (scores[i] >= PASSING_GRADE) {pass_count++;}}average = sum / count;printf("\n=== 统计信息 ===\n");printf("学生总数: %d\n", count);printf("平均分: %.2f\n", average);printf("及格人数: %d\n", pass_count);printf("及格率: %.1f%%\n", (float)pass_count / count * 100);
}int main() {// 局部变量float student_scores[MAX_STUDENTS];int current_count = 0;int choice;do {printf("\n=== 学生成绩管理系统 ===\n");printf("1. 添加学生成绩\n");printf("2. 查看统计信息\n");printf("3. 退出\n");printf("请选择操作: ");scanf("%d", &choice);switch(choice) {case 1:add_student(student_scores, ¤t_count);break;case 2:display_statistics(student_scores, current_count);break;case 3:printf("感谢使用!\n");break;default:printf("无效选择!\n");}} while(choice != 3);return 0;
}
9. 常见错误与注意事项
#include <stdio.h>int main() {// ❌ 常见错误1:使用未初始化的变量// int uninitialized;// printf("%d\n", uninitialized); // 危险!// ❌ 常见错误2:变量名拼写错误// int studentAge = 20;// printf("%d\n", studentage); // 错误:应该是studentAge// ❌ 常见错误3:超出变量作用域// {// int temp = 100;// }// printf("%d\n", temp); // 错误:temp已超出作用域// ❌ 常见错误4:修改常量// const int MAX = 100;// MAX = 200; // 错误// ✅ 正确做法int score = 0; // 总是初始化变量const int MAX_SCORE = 100; // 常量使用大写int student_count = 0; // 使用有意义的名称printf("程序正常运行!\n");return 0;
}