c语⾔的作⽤域、变量与结构体
⼀、变量的作⽤域
根据变量的作⽤域,可以分为:
1.局部变量:
1> 定义:在函数(代码块)内部定义的变量(包括函数的形参)
2> 作⽤域:局部变量只有在定义它的函数内部使⽤,其它函数不能使⽤它。从定义变量的那⼀⾏开始,⼀直到代码块结束
3> ⽣命周期:从定义变量的那⼀⾏开始分配存储空间,代码块结束后,就会被回收
4> 没有固定的初始值
2.全局变量
1> 定义:在函数外⾯定义的变量
2> 作⽤域:从定义变量的那⼀⾏开始,⼀直到⽂件结尾(能被后⾯的所有函数共享)
3> ⽣命周期:程序⼀启动就会分配存储空间,程序退出时才会被销毁
4> 默认的初始值就是0
1int a;
2
3int main ()
4  {
5int b;
6return0;
7  }
第1⾏的变量a是全局变量,第7⾏的变量b是局部变量。
1// 全局变量:a、b、c
2// 局部变量:v1、v2、e、f
3
4 #include <stdio.h>
5// 变量a的初值是10
6int a = 10;
7
8// 变量b的初值是0
9// 变量c的初值是20
10int b , c = 20;
11
12int sum(int v1, int v2)
13 {
14return v1 + v2;
15 }
16
17void test()
18 {
19    b++;
20
21int i = 0;
22    i++;
23
24    printf("b=%d, i=%d\n", b, i);
25 }
26
27int main()
28 {
29    test();
30    test();
31    test();
32
33int e = 10;
34
35    {
36        {
37int f = 30;
38        }
39    }
40
41return0;
42 }
⼆、变量的存储类型
* 变量的存储类型就是指变量存储在什么地⽅。有3个地⽅可以⽤于存储变量:普通内存、运⾏时堆栈、硬件寄存器。变量的存储类型决定了变量何时创建、何时销毁以及它的值能保持多久,也就是决定了变量的⽣命周期。
* C语⾔根据变量的存储类型的不同,可以把变量分为:⾃动变量、静态变量、寄存器变量。
1.⾃动变量
1> 定义:⾃动变量是存储在堆栈中的。
2> 哪些是⾃动变量:被关键字auto修饰的局部变量都是⾃动变量,但是极少使⽤这个关键字,基本上是废的,因为所有的局部变量在默认情况下都是⾃动变量。
2.静态变量
1> 定义:静态变量是存储在静态内存中的,也就是不属于堆栈。
2> 哪些是静态变量:
所有的全局变量都是静态变量
被关键字static修饰的局部变量也是静态变量
3> ⽣命周期:静态变量在程序运⾏之前创建,在程序的整个运⾏期间始终存在,直到程序结束。
3.寄存器变量
1> 定义:存储在硬件寄存器中的变量,称为寄存器变量。寄存器变量⽐存储在内存中的变量访问效率更⾼(默认情况下,⾃动变量和静态变量都是放在内存中的)
2> 哪些变量是寄存器变量:
被关键字register修饰的⾃动变量都是寄存器变量
只有⾃动变量才可以是寄存器变量,全局变量和静态局部变量不⾏
寄存器变量只限于int、char和指针类型变量使⽤
3> ⽣命周期:因为寄存器变量本⾝就是⾃动变量,所以函数中的寄存器变量在调⽤该函数时占⽤寄存器中存放的值,当函数结束时释放寄存器,变量消失。
1int main() {
2      register int a;
3return0;
4 }
第2⾏的变量a是个寄存器变量。
4> 使⽤注意:
由于计算机中寄存器数⽬有限,不能使⽤太多的寄存器变量。如果寄存器使⽤饱和时,程序将寄存器变量⾃动转换为⾃动变量处理为了提⾼运算速度,⼀般会将⼀些频繁使⽤的⾃动变量定义为寄存器变量,这样程序尽可能地为它分配寄存器存放,⽽不⽤内存
3> ⽣命周期:静态变量在程序运⾏之前创建,在程序的整个运⾏期间始终存在,直到程序结束。
1 #include <stdio.h>
const的作用
2
3int a;
4
5void test() {
6static int b = 0;
7      b++;
8
9int c = 0;
10      c++;
11
12      printf("b=%d, c=%d \n", b, c);
13  }
14
15int main() {
16int i;
17// 连续调⽤3次test函数
18for (i = 0; i<3; i++) {
19          test();
20      }
21
22return0;
23  }
* 第3⾏的变量a、第6⾏的变量b都是静态变量,第9⾏的变量c、第16⾏的变量i是⾃动变量。
* 因为第6⾏的变量b是静态变量,所以它只会被创建⼀次,⽽且⽣命周期会延续到程序结束。因为它只会创建⼀次,所以第6⾏代码只会执⾏⼀次,下次再调⽤test函数时,变量b的值不会被重新初始化为0。
* 注意:虽然第6⾏的变量b是静态变量,但是只改变了它的存储类型(即⽣命周期),并没有改变它的作⽤域,变量b还是只能在test函数内部使⽤。
* 我们在main函数中重复调⽤test函数3次,输出结果为:
⼀、什么是结构体
* 当⼀个整体由多个数据构成时,我们可以⽤数组来表⽰这个整体,但是数组有个特点:内部的每⼀个元素都必须是相同类型的数据。
* 在实际应⽤中,我们通常需要由不同类型的数据来构成⼀个整体,⽐如学⽣这个整体可以由姓名、年龄、⾝⾼等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,⾝⾼可以是浮点型。
* 结构体允许内部的元素是不同类型的。
⼆、结构体的定义
1.定义形式
结构体内部的元素,也就是组成成分,我们⼀般称为"成员"。
结构体的⼀般定义形式为:
1struct 结构体名{
2
3类型名1 成员名1;
4
5类型名2 成员名2;
6
7      ……
8
9类型名n 成员名n;   
10
11  };
例如
struct Date
{
int year;
int month;
int day;
};
struct是关键字,是结构体类型的标志。
2.举例
⽐如,我们定义⼀个学⽣
1struct Student {
2char *name; // 姓名
3int age; // 年龄
4float height; // ⾝⾼
5 };
上⾯定义了⼀个叫做Student的结构体,共有name、age、height3个成员。
三、结构体变量的定义
前⾯只是定义了名字为Student的结构体类型,并⾮定义了⼀个结构体变量,就像int⼀样,只是⼀种类型。接下来定义⼀个结构体变量,⽅式有好多种。
1.先定义结构体类型,再定义变量
11struct Student {
22char *name;
33int age;
44 };
55
66struct Student stu;
7
第6⾏定义了⼀个结构体变量,变量名为stu。struct和Student是连着使⽤的。
2.定义结构体类型的同时定义变量
1struct Student {
2
3char *name;
4int age;
5 } stu;
结构体变量名为stu
3.直接定义结构体类型变量,省略类型名
1struct {
2
3char *name;
4int age;
5 } stu;
结构体变量名为stu

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。