C语言(三)简单内存

内存

4.6变量的储存类别

4.6.1内存的分区:


1、内存:物理内存、虚拟内存 I
物理内存:实实在在存在的存储设备
虚拟内存:操作系统虚拟出来的内存。
操作系统会在物理内存和虚拟内存之间做映射。
在 32 位系统下,每个进程的寻址范围是 4G.0x00 00 00 00~0xff ff ff ff
在写应用程序的,咱们看到的都是虚拟地址。
2、在运行程序的时候,操作系统会将 虚拟内存进行分区。

1).堆 
        在动态申请内存的时候,在堆里开辟内存。

2).
        主要存放局部变量。

3).静态全局区
        1: 未初始化的静态全局区静态变量(定义变量的时候,前面加 static 修饰),或全局变量 ,没有初始化的,存在此区

        2:初始化的静态全局区
全局变量、静态变量,赋过初值的,存放在此区
4).代码区
        存放咱们的程序代码
5).文字常量区
        存放常量的。


4.7普通的全局变量

4.7.1


概念:
        在函数外部定义的变量
        int num=100://num 就是一个全局变量
        int main()

{

        return 0;
}
作用范围:
        普通全局变量的作用范围,是程序的所有地方
        只不过用之前需要声明。声明方法 extern int num:
        注意声明的时候,不要赋值。
生命周期:
        程序运行的整个过程,一直存在,直到程序结束。
        注意:定义普通的全局变量的时候,如果不赋初值,它的值默认为 0

#include <stdio.h>
int num;
void fun(void);
int main()
{
	printf("in main num = % d\n",num);
		num = 100;
	fun();
	return 0;
}
void fun(void)
{
	printf("in fun num = % d\n",num);
	}

4.7.2 静态全局变量static


概念:
        定义全局变量的时候,前面用 static 修饰。
        static int num=100://num 就是一个静态全局变量

        int main()
        {

        return 0;

        }
作用范围:
        static 限定了静态全局变量的,作用范围

       

#include <stdio.h>
static int num;
void fun3(void);
int main()
{
	printf(" num = % d\n",num);
	num = 101;
	fun3();
	return 0;
}
void fun3(void)
{
	printf("num = % d\n",num);
	}

 但只能在它定义的.c(源文件) 中有效
生命周期:
        在程序的整个运行过程中,一直存在。

注意:

        定义静态全局变量的时候,如果不赋初值,它的值默认为 0

4.7.3普通的局部变量


概念:
在函数内部定义的,或者复合语句中定义的变量
int main()

        {
                int num://普通局部变量

        {

                int a://普通局部变量

        }
}
作用范围:
        在函数中定义的变量,在它定义函数中有效
        在复合语句中定义的,在它定义的复合语句中有效。
生命周期:
        在函数调用之前,局部变量不占用空间,调用函数的时候才为局部变量开辟空间,函数结束了,局部变量就释放了
        在复合语句中定义的亦如此。

#include <stdio.h>
void fun(void)
{
	int num = 3;
	num++;
	printf("num=%d\n", num);
}
void fun2(int x)
{
	x++;
	printf("x=%d\n", x);

}
int main()
{
	fun();
	fun();
	fun();
	fun2(3);
	return 0;
}

4.7.4静态的局部变量 


概念:
        定义局部变量的时候,前面加 static 修饰
 作用范围:
        在它定义的函数或复合语句中有效、

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

#include <stdio.h>
void fun(void)
{
	static int num = 3;
	num++;
	printf("num=%d\n", num);
}
void fun2(int x)
{
	x++;
	printf("x=%d\n", x);

}
int main()
{
	fun();
	fun();
	fun();
	fun2(3);
	return 0;
}

注意:
定义普通局部变量,如果不赋初值,它的值是随机的。
定义静态局部变量,如果不赋初值,它的值是02:普通全局变量,和静态全局变量如果不赋初值,它的值为 0

#include <stdio.h>
void fun(void)
{
	static int num = 3;
	num++;
	printf("num=%d\n", num);
}
void fun2(void)
{
	//int a;
	static int b;
	//printf("普通局部变量 a=%d\n", a);
	printf("静态局部变量 b=%d\n", b);

}
int main()
{
	fun();
	fun();
	fun();
	fun2();
	return 0;
}

#include<stdio.h>
void fun(void);
int num = 100;
int main()
{
	int num = 10;
	printf("int main fun num=%d\n", num);
	fun();
	return 0;
}
void fun (void)
{
	printf("int fun num = %d\n", num);
}

num=10 第二个=100

4.7.5外部函数


        咱们定义的普通函数,都是外部函数。
        即函数可以在程序的任何一个文件中调用。


4.7.6内部数


        在定义函数的时候,返回值前面加 static 修饰。这样的函数被称为内部函数。
        static 限定了函数的作用范围,在定义的.c 中有效
        内部函数,和外部函数的区别:
        外部函数,在所有地方都可以调用,
        内部函数,只能在所定义的.c 中的函数调用
扩展:
        在同一作用范围内,不允许变量重名。
        作用范围不同的可以重名。
        局部范围内,重名的全局变量不起作用。(就近原则)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值