c语言中的内存的分区,全局变量,局部变量,编译过程的知识点总结

文章目录


前言

跟随视频【千锋教育嵌入式物联网教程800集,C语言编程入门到精通(物联网开发工程师必备视频)】 https://www.bilibili.com/video/BV1FA411v7YW/?share_source=copy_web&vd_source=9b3841f7a383f6d5e7143a03873a616b

学习笔记


提示:以下是本篇文章正文内容,下面案例可供参考

一、本章内容

  1. 内存的分区
  2. 普通的全局变量
  3. 静态全局变量
  4. 普通的局部变量
  5. 静态的局部变量
  6. 外部函数
  7. 内部函数
  8. c语言编译过程
  9. include
  10. define
  11. 选择性编译

二、各内容详细介绍

1.内存的分区

  • 32位的操作系统中,虚拟内存(4G)被分为两个部分,3G的用户空间和1G的内核空间,其中用户空间是当进程所私有的,内核空间是一个系统中所有的进程所公有的。
    进程:当一个程序在运行的时候称为进程
  • 在运行程序时,操作系统会将虚拟内存进行分区
    1)堆区
           在动态申请内存时,在堆区开辟内存
    2)栈区
           主要存放局部变量
           在一个函数里,所定义的一个变量,不加任何修饰都是局部变量
    3)静态全局区
            1:未初始化(即未赋值)的静态全局区
                  静态变量或全局变量,没有初始化,存在此区。
            2:初始化的静态全局区
                  全局变量,静态变量,赋过初值的,存放在此区。
    4)代码区
            存在咋们的程序代码。
    5)文字常量区
            存放常量。

2.普通全局变量

概念:在函数外部定义的变量

int num=100;                //num是一个全局变量
int main()

{

        return 0;

}        

作用范围

        全局变量的作用范围,是程序的所有地方

        在同一个.c文件中,声明时前面不需要加上extern,如果要在其他.c文件中使用的话则需要加上extern 例如:extern int num;

        注意:声明前不能赋值

生命周期

        程序运行的整个过程 ,一直存在,直到程序结束

注意

        不赋值时,默认为0

        全局变量可在程序的任一位置进行操作。

3.静态全局变量

 概念

        静态全局变量:在定义全局变量前用static修饰

static int num=100;                //num是一个静态全局变量
int main()

{

        return 0;

}        

作用范围

        static限定了静态全局变量的作用范围
        只能在它定义的.c文件中使用。

生命周期

        在程序的整个运行过程中,一直存在。

注意

        不赋值时,默认为0。

4.普通局部变量

 概念

        在函数内部定义的,或者符合语句中定义的变量

int main()

{

        int num;        //局部变量(在函数内部定义)

        {

                int a;         //局部变量【在复合语句(在这个大括号内)中定义,相当于在函数内部申请了一块独立的空间】

        }

        return 0;

}        

作用范围

        在函数中定义的变量,在函数中有效。

        在复合语句中定义的变量,在复合语句中有效。

生命周期

        在函数调用之前,局部变量不占用空间,调用函数的时候,才为局部变量开辟空间,函数结束后,局部变量才释放(函数执行完后,局部变量恢复初始状态)。

        复合语句同理。

5.静态的局部变量

 概念

        定义局部变量的时候,前面加static修饰      

作用范围

        在它定义的函数或复合语句中有效

生命周期

        第一次调用函数的时候,开辟空间赋值,函数结束后,不释放,以后再调用函数的时候,就不再为其开辟空间,也不赋初值给他,用的是以前的那个变量

注意

        1:普通局部变量不进行初始化,则默认值为随机值
              静态局部变量不进行初始化,则默认值为0.

        2:普通全局变量和静态全局变量如果不赋初值,他们的值都是为0.

6.外部函数

        自己定义的普通函数,都是外部函数。

        即函数可以再程序的任何一个文件中调用

        在分文件编程中,只需要将函数的实现过程写在指定的.c文件中,然后将其声明写在指定的.h文件中,其他文件只要包含了头文件,就可以使用外部函数。

7.内部函数

        在定义函数的时候,返回值前面加个static修饰,这样的函数成为内部函数。

        static限定了函数作用 范围,在定义的.c中有效

扩展

        在同一作用范围内,不允许变量重名。
        作用范围不同的可以重名。

        局部范围内,重名的全局变量不起作用。(向上就近原则)

例:

int num=100;  //全局变量,放在静态全局区

int main()

{

        printf("%d\n",num);        //输出为100,用的是全局变量

        int num=9;        //局部变量,存放在栈区

        printf("%d\n",num);        //输出为9,用的是局部变量

        return 0;

}

以上称为向上就近原则

8.c语言的编译过程

        过程:预处理   >   编译   >   汇编   >   链接

9.include

        #include<>  //用尖括号包含头文件,在系统指定的路径下找头文件

        #include""   //用双引号包含的头文件,先再当前目录下找头文件,找不到再到系统指定的路径下找

        所以我们自己写 的头文件一定要用""双引号,不然可能报错。

注意

        1:include经常用来包含头文件,也可以包含.c文件,但大家不要包含.c

        因为include包含的头文件会在预编译被展开,如果一个.c文件被包含多次,展开多次,会导致函数重复定义,所以不要包含.c文件。

        2:预处理只是对include等预处理操作进行处理,并不会进行语法检查,这个阶段有语法错误也不会报错,第二个阶段即编译阶段才会进行语法检查。

10.define

        定义宏用define定义

        宏是在预编译的时候进行替换的。

        1)不带参宏

                例:#define         PI         3.14

                在预编译的时候如果代码中出现了PI就用3.14代替

                宏的好处:只要修改宏定义,其他地方在预编译的时候就会重新替换。

        注意:宏定义后边没有分号。

                宏定义的作用范围:

                        从定义的地方到本文件末尾。

                        如果想在中间终止宏的定义范围,用:#undef   PI     //终止PI的作用

        2)带参宏

                #define        S(a,b)        a*b

                注意带参宏的形参a和b没有类型名。

                S(2,4)将在预处理的时候替换成实参 代替字符串的形参,其他字符保留,变成2*4

#define         S(a,b)     a*b

int main()

{

        printf("%d/n",S(2,4));

        printf("%d/n",S(2+8,4));

        return 0;

}   

执行结果:

8

34

S(2+8,4)等于 34的原因是代入a*b后,2+8*4=2+32=34

若想得(2+8)*4=40的话,则宏定义为#define   S(a,b)     ((a)*(b))   

3)带参宏和带参函数的区别

         带参宏被调用了多少次就会展开多少次,执行代码的时候没有函数调用的时候,不需要压栈弹栈,所以带参宏是浪费了空间,节省了时间。

        带参函数,代码只有一份,存在代码段调用的时候去代码段取指令,调用的时候要压栈弹栈,有个调用过程,所以说带参函数是浪费了时间,节省了空间。

        带参函数的形参具有类型的,带参宏的形参没有类型名

        如果功能实现的代码相对简单,并且不需要开辟太多的空间,可以选着使用带参宏,但大多数情况都会使用函数。

11.选择性编译

1)

#ifdef AAA

                代码段一

#else

                代码段二

#endif

//在当前.c中若ifdef上边定义过AAA,就编译代码段一,否则编译代码段二

注意:和if else 语句的区别,if else 语句都会被编译,而这个是通过条件选着性执行代码而选着性编译,只有一块代码被编译。

例:

#define AAA

int main()

{

        #ifdef AAA

                printf("hello\n");

        #else

                printf("no\n");

        #endif

        

        return 0;

}

执行结果为:hello

2)

#ifndef AAA

        代码段一

#else

        代码段二

#endif

过程:如果没有AAA,编译代码段一,否则编译代码二

和第一种互补

这种方法经常用在防止头文件重复包含,#ifndef常用于多文件编程中.h的第一行,#endif写在最后一行

3)

#if 表达式

        程序一

#else

        程序二

#endif

如果表达式为真,编译程序一,否则编译程序二,这种形式一般用于注释多行代码

例如:

#if 0        //0为假,在这里表示不编译,改为1时则编译

#endif

选择性编译都是在预编译阶段干的事情。


总结

继续努力

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C语言有四种类型的变量:局部变量全局变量、静态局部变量和静态全局变量。 1. 局部变量(Local Variables): 局部变量是在函数内部声明的变量,它们只在函数内部可见和访问。局部变量的作用域仅限于声明它们的函数内部。当函数执行完毕后,局部变量会被销毁,其占用的内存也会被释放。 2. 全局变量(Global Variables): 全局变量是在函数外部声明的变量,它们可以被程序的所有函数访问。全局变量的作用域从声明开始的地方一直延伸到文件的末尾。全局变量在整个程序的执行过程都是存在的,因此会占用内存。需要注意的是,在多个文件使用同名的全局变量会导致冲突,因此应该避免这样的情况发生。 3. 静态局部变量(Static Local Variables): 静态局部变量与普通局部变量相似,都是在函数内部声明。不同之处在于,静态局部变量只会在首次进入该函数时进行初始化,之后的函数调用不会重新初始化该变量。同时,静态局部变量的作用域仍然限制在声明它们的函数内部,但是其生命周期会延长到整个程序的执行过程。 4. 静态全局变量(Static Global Variables): 静态全局变量与普通全局变量相似,都是在函数外部声明。不同之处在于,静态全局变量只能在声明它们的文件内部访问,其作用域被限制在当前文件范围内。其他文件无法访问该变量。静态全局变量会在程序开始执行时进行初始化,并且在整个程序执行期间都存在。 以上就是C语言四种不同类型的变量:局部变量全局变量、静态局部变量和静态全局变量的特点和用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值