c语言枚举变量作用域,C语言结构体 共同体 枚举

本文详细介绍了C语言中的结构体和枚举。结构体允许存储不同类型的数据,包括局部和全局变量的特性、内存分配以及如何通过指针访问结构体成员。枚举则是一种基本数据类型,用于定义有限的固定取值,本质上是整型。同时,文章还探讨了枚举的定义和使用,以及结构体和枚举在内存中的布局和访问方式。

语言------结构体    枚举学习,有需要的朋友可以参考下。

结构体  枚举

1.局部变量:

>定义.在代码块内部定义的变量都是局部变量,包括形参

>作用域.从定义变量的那一行开始,一直到代码块结束

>存放位置.存放在栈中

>生命周期.执行到定义变量的那一行开始分配存储空间,代码块结束后就释放

>特点:没有固定的初始化值

2.全局变量:

>定义.在函数外定义的变量

>.作用域.从定义变量的那一行开始,一直到文件末尾

>存放位置.静态区

>生命周期.程序一启动就会分配存储空间,知道程序结束才会释放

特点:默认初始化值是0

结构体基本概念

变量类型变量名;

结构体变量类型变量名;

想定义结构体变量分为两部:

1.定义结构体类型

2.通过结构体类型定义结构体变量

struct结构体类型名称

{

成员(属性)

}

给结构体赋值要通过.的方式赋值

注意点

,只能在定义结构体变量的同时进行初始化,不能先定义结构体变量再初始化

结构体内存分析

1.定义结构体类型,

定义结构体类型的时候不会为结构体类型分配存储空间

struct Date

{

int year; //年

int month; //月

int day; //日

};

2.定义结构体变量

只有在定义结构体变量的时候才会真正的分配存储空间

结构变量存储值也数组也一样,也是从小到大的存,

也就是说从第一个成员开始存放

结构体变量的地址就是它第一个成员的地址

注意:结构体在分配存储空间的时候有一个补齐算法

结构体所占存储空间的大小,必须是占用内存最大成员的字节数的倍数

结构体变量的定义方式:

1.第一种方式:先定义结构体类型,再定义结构体变量

1.定义结构体类型

struct Student

{

int age;

char *name;

};

2.通过结构体类型定义结构体变量

struct Student stu;

2.第二种定义方式:定义结构体类型的同时定义结构体变量

struct Student

{

int age;

char *name;

} stu;

struct Student stu2;

3.第三种方式:定义结构体类型的同时定义结构体变量,并且这个结构体类型没有名称

struct

{

intage;

char*name;

} stu;

缺点:不能复用

结构体类型的作用域:

在函数外定义的结构体类型的作用域是从定义的那一行开始一直到文件末尾

在代码块中定义的结构体类型的作用域和局部变量的作用域相同

结构体类型的作用域:

> 1.定义在函数外面:全局有效(从定义的那一行开始一直到文件末尾)

> 2.定义在函数里面:局部有效(从定义的那一行开始一直到函数结束)

结构体指针

变量类型*变量名;

struct Student *sp;

sp = &stu;

*sp == stu

stu.age

注意点:.的优先级要比*的优先级高,所以要先用()提高*的优先级

(*sp).age = 66;

当利用指针指向结构体变量后的几种访问方式

1.变量名.成员 stu.age;

2.(*指针变量名).成员;  (*sp).age;

3.指针变量名->成员;   sp->age;

结构体嵌套定义:

定义结构体类型的时候,类型当中的成员还是一个结构体

如果结构体中的成员还是结构体的时候可以通过.逐层访问

枚举

枚举是一种基本数据类型

当某一个变量只有固定的几个取值的时候可以定义枚举变量

想定义枚举变量必须先定义枚举类型,定义枚举类型的作用是告诉系统枚举有哪些取值

1.先定义枚举类型

enum枚举名称

{

取值

}

枚举的本质就是整型

枚举的取值默认情况是从0开始依次递增

2.通过枚举类型定义枚举变量

虽然表面上看上去只能给枚举变量赋值我们定义的几个固定的值,

但是枚举变量的本质就是一个整型变量所以也可以赋值其它整型常量

数据类型总结

1.基本数据类型

整型:

int 4个字节%d

short 2个字节%hd

long 8个字节%ld

long long 8个字节%lld

unsigned 4个字节0和正数0~2(32)-1; %u

signed 4个字节正数负数和0 -2(31)~2(31)-1

字符型:

char 1个字节%c

存储细节: ASCII值0~127

浮点型:

float 4个字节%f

double 8个字节%lf

枚举类型:

> 1.先定义枚举类型,再通过枚举类型定义枚举变量

> 2.定义格式: enum枚举类型名称{取值};  enum枚举类型名称变量名称;

> 3.枚举的本质就是整型

2.构造类型

数组:

只能存放同一种类型的数据

元素类型变量名[元素个数];

结构体:

可以存放不同类型的数据

*定义结构体类型 struct结构体类型名称{成员;};

*通过结构体类型定义结构体变量 struct结构体类型名称变量名称;

3.指针类型

变量类型*变量名称;

指针类型的作用:

1.定义的时候是什么类型将来就只能指向什么类型的数据(保存什么类型的变量地址)

2.指针取值的时候会根据TA的类型取值(是什么类型就取多少个字节)

4.空类型

void

C语言变量是程序设计的基础,理解其类型、使用方法和存储机制对于编写高效、正确的程序至关重要。以下从变量的类型、作用域、生命周期、存储方式等方面详细介绍C语言变量的相关知识[^1]。 ### 变量类型 C语言中的变量类型主要分为基本数据类型、构造数据类型、指针类型和空类型。 - **基本数据类型**:包括整型(`int`)、字符型(`char`)、浮点型(单精度 `float` 和双精度 `double`)等。例如: ```c int num = 10; char ch = 'A'; float f = 3.14f; double d = 3.1415926; ``` - **构造数据类型**:由基本数据类型组合而成,如数组、结构体(`struct`)、联合体(`union`)和枚举(`enum`)。例如: ```c // 数组 int arr[5] = {1, 2, 3, 4, 5}; // 结构体 struct Person { char name[20]; int age; }; struct Person p = {"John", 25}; ``` - **指针类型**:用于存储变量的地址。例如: ```c int num = 10; int *ptr = &num; ``` - **空类型**:用 `void` 表示,通常用于函数返回值类型或指针类型。例如: ```c void func() { // 函数体 } ``` ### 变量作用域 变量作用域决定了变量在程序中可以被访问的范围,主要分为局部变量和全局变量。 - **局部变量**:在函数内部或代码块内部定义的变量,其作用域仅限于定义它的函数或代码块。例如: ```c void test() { int local = 10; // 局部变量 // 可以在 test 函数内部访问 local } ``` - **全局变量**:在函数外部定义的变量,也叫外部变量,可以被本程序中所有函数所共同使用。当定义的全局变量与局部变量重名时,在函数内会屏蔽全局变量,只使用局部变量 [^2]。例如: ```c int global = 20; // 全局变量 void func() { int global = 30; // 局部变量,屏蔽全局变量 // 这里使用的是局部变量 global } ``` ### 变量生命周期 变量的生命周期指的是变量从创建到销毁的时间段,与变量的存储方式有关。 - **自动变量**:默认情况下,在函数内部定义的局部变量都是自动变量,存储在栈上。函数调用结束后,自动变量的内存会被释放。例如: ```c void func() { int auto_var = 10; // 自动变量 // 函数调用结束后,auto_var 的内存被释放 } ``` - **静态变量**:使用 `static` 关键字声明的变量,存储在静态存储区。静态变量在程序开始执行时就被初始化,并且只初始化一次,函数调用结束后不会销毁,会保留其值。例如: ```c void test() { static int static_var = 0; static_var++; // 每次调用 test 函数,static_var 的值会保留 } ``` - **全局变量**:全局变量存储在静态存储区,其生命周期是整个程序的运行期间。如果不对全局变量初始化,则会自动初始化为 0 [^2]。 - **寄存器变量**:使用 `register` 关键字声明的变量,建议编译器将变量存储在寄存器中,以提高访问速度。寄存器变量的生命周期与自动变量相同,但不能获取其地址。例如: ```c void func() { register int reg_var = 10; // 寄存器变量 // 不能使用 &reg_var 获取寄存器变量的地址 } ``` ### 变量存储方式 C语言变量的存储方式决定了变量在内存中的存储位置,主要有栈、堆、静态存储区和寄存器。 - **栈**:自动变量和函数调用的上下文信息存储在栈上。栈的特点是内存分配和释放由系统自动管理,速度快。 - **堆**:使用 `malloc`、`calloc`、`realloc` 等函数动态分配的内存存储在堆上。堆的内存分配和释放需要程序员手动管理,使用完后要使用 `free` 函数释放内存,否则会导致内存泄漏。例如: ```c #include <stdlib.h> int main() { int *ptr = (int *)malloc(sizeof(int)); if (ptr != NULL) { *ptr = 10; free(ptr); // 释放内存 } return 0; } ``` - **静态存储区**:全局变量和静态变量存储在静态存储区,程序开始执行时分配内存,程序结束时释放内存。 - **寄存器**:寄存器变量存储在CPU的寄存器中,访问速度最快,但寄存器数量有限,编译器可能会忽略 `register` 关键字。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值