======变量 修饰词====================
一、变量 & 作用域
(1)局部变量:----> { }内 ----> 不赋值时,系统默认为随机数;
(2)全局变量:----> 整个应用程序 ----> 不赋值时,系统默认为0;
二、变量的存储类型//变量存储在哪里(内存、硬件寄存器)
【1】内存分为:栈区、堆区(程序员)、静态存储区
【2】根据存储类型,变量可分为:
自动变量:auto (局部变量—》存于栈区)
静态变量:static(可修饰内部函数(静态函数 ),与全局变量生命周期一样)
寄存器变量:register
三、静态变量
(1)它会保留上一次的值
(2)它的生命周期与应用程序绑定
(3)定义在函数内部 / 外部,不影响其生命周期
(4)存于静态存储区
(5)若写在函数外面,其他的函数也可以使用它;若写在函数里面,只能在对应函数中使用
静态变量 & 全局变量 & 静态全局变量
静态变量:static修饰的变量,若定义在函数体外,就是静态全局变量
全局变量:定义在函数体外,默认修饰词为extern
静态全局变量:static修饰的全局变量
共同点:生命周期一样,均与应用程序绑定
异同点:作用域不一样
静态变量若定义在{ }内,则其作用域在{ }内;若定义在函数体外(即静态全局变量),则其作用域在整个当前文件中。
全局变量作用域在整个应用程序,其他文件也可以调用和访问
四、寄存器变量
(1)register修饰的自动变量
(2)存于硬件寄存器(大小有限)中,访问效率 > 内存
(3)生命周期:{ } 中
(4)只限于int、char、float、double、指针类型的变量使用
五、extern、 static 与函数
外部函数:当前文件中定义,允许其它文件访问、调用———>extern修饰
内部函数:当前文件中定义,不允许其它文件访问、调用———>static修饰
内部函数被其他文件调用时,编译没有问题,链接时会出错
六、extern、 static 与变量
(1)extern声明一个已经定义过的变量,而非定义一个变量
(2)默认情况下,一个全局变量(外部)是可以供多个源文件共享的,
(即,多个源文件中,同名的全局变量都代表同一个变量)。
(3)static修饰的全局变量,只能用于当前文件
======结构体、枚举、typedef====================
一、结构体
结构体定义:
struct
结构体名称
{}
变量名;
注意:定义结构体结尾一定要加分号
// 结构体不能够对自身递归使用
结构体初始化方法:
方法一: struct Student jack = {10, "jack", 1.5, {2011, 5, 5}};
方法二: 分别设置各个属性的值
// jack.age = 10;
// jack.name = "jack";
// jack.height = 1.5;
-> 指针符号
给野指针开辟空间 (*name )
jack.name = malloc(sizeof(char)*10);
注意:定义结构体结尾一定要加分号
// 结构体不能够对自身递归使用
结构体初始化方法:
方法一: struct Student jack = {10, "jack", 1.5, {2011, 5, 5}};
方法二: 分别设置各个属性的值
// jack.age = 10;
// jack.name = "jack";
// jack.height = 1.5;
-> 指针符号
给野指针开辟空间 (*name )
jack.name = malloc(sizeof(char)*10);
释放内存:
malloc———delete(jack.name);
二、枚举
枚举定义:
enum
枚举名称
{
元素
1
,元素
2
,元素
3}
变量;
枚举值为数值,从
0
开始,逐次累加;若不想从
0
开始,创建枚举类型的变量,如
enum Weather weather = 1;
三、typedef
作用:为已知类型定义一个新名
如: typedef int Integer;
注意与 #define 的区别:
#define 是前面代替后面,结尾处没有 分号
给指针定义新名: typedef char *string; string name = “jack”;
给结构体定义新名 ( 枚举与其相同 ):
typedef struct Student _student;
typedef struct Student {} _student;
typedef struct {} _student;
7.typedef 与函数指针
定义一个指针指向 sum 函数
Integer (*p)(Integer, Integer) = sum;
typedef 函数指针返回值 (* 指针名 )( 函数形参 );
使用:指针名 p1 = 函数名
例如: typedef int (*p)(int a, int b);
如: typedef int Integer;
注意与 #define 的区别:
#define 是前面代替后面,结尾处没有 分号
给指针定义新名: typedef char *string; string name = “jack”;
给结构体定义新名 ( 枚举与其相同 ):
typedef struct Student _student;
typedef struct Student {} _student;
typedef struct {} _student;
7.typedef 与函数指针
定义一个指针指向 sum 函数
Integer (*p)(Integer, Integer) = sum;
typedef 函数指针返回值 (* 指针名 )( 函数形参 );
使用:指针名 p1 = 函数名
例如: typedef int (*p)(int a, int b);
p p1 = sum;
/*
定义一个学生的结构体,成员变量有名字、学籍号、某一学科的成绩。分别从键盘读入两个学生的信息。最后再后台输出谁的成绩好就在公告栏里表彰出来,如果成绩相同,那么就在公告栏中一同显示出来。
定义一个学生的结构体,成员变量有名字、学籍号、某一学科的成绩。分别从键盘读入两个学生的信息。最后再后台输出谁的成绩好就在公告栏里表彰出来,如果成绩相同,那么就在公告栏中一同显示出来。
*/
struct
Student{
char
*name;
int xueji;
int score;
} stu1, stu2;
int max( int a, int b){
return (a > b? a : b);
int xueji;
int score;
} stu1, stu2;
int max( int a, int b){
return (a > b? a : b);
}
int
main(
int
argc,
const
char
* argv[]) {
// 给指针 *name 开辟空间
stu1 . name = malloc ( sizeof ( char ) * 10 );
stu2 . name = malloc ( sizeof ( char ) * 10 );
printf ( " 请输入第一个学生的姓名、学籍号、姓名: " );
scanf ( "%s %d %d" , stu1 . name ,& stu1 . xueji ,& stu1 . score );
printf ( " 请输入第二个学生的姓名、学籍号、姓名: " );
scanf ( "%s %d %d" , stu2 . name ,& stu2 . xueji ,& stu2 . score );
if ( stu1 . score > stu2 . score ) {
printf ( "%s %d %d \n" , stu1 . name , stu1 . xueji , stu1 . score );
} else if ( stu1 . score < stu2 . score ){
printf ( "%s %d %d \n" , stu2 . name , stu2 . xueji , stu2 . score );
} else if ( stu1 . score == stu2 . score ){
printf ( "%s %d %d \n" , stu1 . name , stu1 . xueji , stu1 . score );
printf ( "%s %d %d \n" , stu2 . name , stu2 . xueji , stu2 . score );
} else {
printf ( " " );
}
// 给指针 *name 开辟空间
stu1 . name = malloc ( sizeof ( char ) * 10 );
stu2 . name = malloc ( sizeof ( char ) * 10 );
printf ( " 请输入第一个学生的姓名、学籍号、姓名: " );
scanf ( "%s %d %d" , stu1 . name ,& stu1 . xueji ,& stu1 . score );
printf ( " 请输入第二个学生的姓名、学籍号、姓名: " );
scanf ( "%s %d %d" , stu2 . name ,& stu2 . xueji ,& stu2 . score );
if ( stu1 . score > stu2 . score ) {
printf ( "%s %d %d \n" , stu1 . name , stu1 . xueji , stu1 . score );
} else if ( stu1 . score < stu2 . score ){
printf ( "%s %d %d \n" , stu2 . name , stu2 . xueji , stu2 . score );
} else if ( stu1 . score == stu2 . score ){
printf ( "%s %d %d \n" , stu1 . name , stu1 . xueji , stu1 . score );
printf ( "%s %d %d \n" , stu2 . name , stu2 . xueji , stu2 . score );
} else {
printf ( " " );
}
本文深入探讨C语言中的变量使用,详细解释了修饰词的作用,同时介绍了结构体、枚举和typedef的概念及应用,帮助读者更好地理解和运用这些核心概念。

被折叠的 条评论
为什么被折叠?



