黑马程序员-变量作用域,存储类型,类型总结,递归思想

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

C语言有丰富的数据类型和运算符,因此计算能力非常强大,计算过程中使用的值一般用变量来存储。变量也是有分类型的,不同类型的变量有不同的存储类型、不同的生命周期、不同的作用域,C语言也提供了一些关键字来设置变量的属性(比如设置存储类型、生命周期)。

 一、变量的作用域

C语言根据变量作用域的不同,将变量分为局部变量和全局变量。

1.局部变量

1> 定义:在函数内部定义的变量,称为局部变量。形式参数也属于局部变量。

2> 作用域:局部变量只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。

3>生命周期:从定义变量的那一行开始分配空间,代码块结束后,会被回收。

2.全局变量

1> 定义:在所有函数外部定义的变量,称为全局变量。

2> 作用域:全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享。

3>生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁。

1 int a;

2

3 int main ()

4 {

5     int b;

6     return 0;

7 }

第1行的变量a是全局变量,第5行的变量b是局部变量。

 

二、变量的存储类型

* 变量的存储类型就是指变量存储在什么地方。有3个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。变量的存储类型决定了变量何时创建、何时销毁以及它的值能保持多久,也就是决定了变量的生命周期。

* C语言根据变量的存储类型的不同,可以把变量分为:自动变量、静态变量、寄存器变量。

1.自动变量

1> 定义:自动变量是存储在堆栈中的

2> 哪些是自动变量:被关键字auto修饰的局部变量都是自动变量,但是极少使用这个关键字,基本上是废的,因为所有的局部变量在默认情况下都是自动变量。

3> 生命周期:在程序执行到声明自动变量的代码块(函数)时,自动变量才被创建;当自动变量所在的代码块(函数)执行完毕后,这些自动变量就会自行销毁。如果一个函数被重复调用,这些自动变量每次都会重新创建。

1 void test(int a, int b) {

2     int c = a + b;

3    

4     auto int d;

5 }

第1行的变量a、b,第2行的变量c、第4行的变量d都是自动变量。

2.静态变量

1> 定义:静态变量是存储在静态内存中的,也就是不属于堆栈。

2> 哪些是静态变量:

所有的全局变量都是静态变量

被关键字static修饰的局部变量也是静态变量

3> 生命周期:静态变量在程序运行之前创建,在程序的整个运行期间始终存在,直到程序结束。

 

 1 #include <stdio.h>

 2

 3 int a;

 4

 5 void test() {

 6     static int b = 0;

 7     b++;

 8    

 9     int c = 0;

10     c++;

11    

12     printf("b=%d, c=%d \n", b, c);

13 }

14

15 int main() {

16     int i;

17     // 连续调用3次test函数

18     for (i = 0; i<3; i++) {

19         test();

20     }

21    

22     return 0;

23 }

 

* 第3行的变量a、第6行的变量b都是静态变量,第9行的变量c、第16行的变量i是自动变量。

* 因为第6行的变量b是静态变量,所以它只会被创建一次,而且生命周期会延续到程序结束。因为它只会创建一次,所以第6行代码只会执行一次,下次再调用test函数时,变量b的值不会被重新初始化为0。

* 注意:虽然第6行的变量b是静态变量,但是只改变了它的存储类型(即生命周期),并没有改变它的作用域,变量b还是只能在test函数内部使用。

* 我们在main函数中重复调用test函数3次,输出结果为:

3.寄存器变量

1> 定义:存储在硬件寄存器中的变量,称为寄存器变量。寄存器变量比存储在内存中的变量访问效率更高(默认情况下,自动变量和静态变量都是放在内存中的)

2> 哪些变量是寄存器变量:

被关键字register修饰的自动变量都是寄存器变量

只有自动变量才可以是寄存器变量,全局变量和静态局部变量不行

寄存器变量只限于int、char和指针类型变量使用

3> 生命周期:因为寄存器变量本身就是自动变量,所以函数中的寄存器变量在调用该函数时占用寄存器中存放的值,当函数结束时释放寄存器,变量消失。

4> 使用注意:

由于计算机中寄存器数目有限,不能使用太多的寄存器变量。如果寄存器使用饱和时,程序将寄存器变量自动转换为自动变量处理

为了提高运算速度,一般会将一些频繁使用的自动变量定义为寄存器变量,这样程序尽可能地为它分配寄存器存放,而不用内存

1 int main() {

2     register int a;

3     return 0;

4 }

第2行的变量a是个寄存器变量。

 

递归的思想

/*

设计一个函数,用来计算b的n次方

 递归的2个条件:

 1.函数自己调用自己

 2.必须有个明确的返回值

*/

#include <stdio.h>

int pow2(int b, int n);

 

int main()

{

    int c = pow2(3, 2);

   

    printf("%d\n", c);

    return 0;

}

 

/*

 pow2(b, 0) == 1

 pow2(b, 1) == b == pow2(b, 0) * b

 pow2(b, 2) == b*b == pow2(b, 1) * b

 pow2(b, 3) == b*b*b == pow2(b, 2) * b

 

 1> n为0,结果肯定是1

 2> n>0,pow2(b, n) == pow2(b, n-1) * b

 */

 

int pow2(int b, int n)

{

   if (n <= 0) return 1;

   return pow2(b, n-1) * b;

}

/*

int pow2(int b, int n)

{

    // 用来保存计算结果

    int result = 1;

    //result *= b;

    //result *= b;

    //result *= b;

    //result *= b;

    //....

   

    //n次

    for (int i = 0; i<n; i++)

    {

        result *= b;

    }

    return result;

}*/

数据类型的总结

基本数据类型

     整型

     int          4字节           %d

     short        2               %hd

     long         8               %ld

     long long    8              %lld

     unsigned long 8            %lu

     

     浮点型

     float        4               %f

     double       8               %lf

     

     字符型

     char         1                %c

     构造类型

     数组

     特点:储存的是相同数据类型的值

     构成:数据类型 +数组名[元素个数]

     结构体

     特点:存储不同数据类型的值

     构成:struct 结构体数据类型{成员变量};

     枚举

     特点:当一个变量有几个固定的取值的时候用枚举

     构成:enum 枚举数据类型{成员};

     

     //定义一个枚举   构成 :enum + 枚举的数据类型

     //枚举常量  枚举里面的成员,如果不赋值,第一个就默认等于0,后面的依次递增

     //枚举成员命名  枚举数据类型+你想代表的意思

     指针

     指向指针的指针

     int a = 4;

     int *aP = &a;

     int **aPP = &aP;

     指向数组的指针

     int arr[2] = {1,2};

     int *p;

     p = arr;

     指向函数的指针

     void test();

     void (*pointer)();

     

     pointer();

     (*pointer)();

     test();

     指向结构体的指针

     struct Person{int age};

     struct Person person = {3};

     struct Person *personP = &person; 

     1)(*person P).age

     2)person P->age

 

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值