Bootstrap

c笔记(第九天)C代码内存关系的简单验证、const关键字、static关键字

1.程序的内存区域
内存:程序运行的地方
分区如下
1)代码区:存放程序代码与各函数的地方
2)数据区:存放全局变量、静态变量和常量
3)栈区:存放局部变量,形参(形参一定是局部变量,但局部变量不一定是形参)
4)堆区:存放动态数据,需要指针访问(运行时分配给生成数据的内存)

2.
局部变量:只能在定义它的函数体内部访问,运行结束后内存会被释放
全局变量:全程序都可以访问修改的变量,与函数栈平级,且默认初始化为0
注:
1)全局变量可以共享公用数据,减少传参
2)若局部变量与全局变量重名,局部变量优先级高于全局变量

3.const关键字
可以把一块内存声明为只读属性

4.static关键字
static修饰局部变量:局部静态变量在调用后不会被销毁,保持其值与存在
static修饰全局变量:全局静态变量使该变量只在其声明所在的文件中可见(避免与其他文件中的同名变量冲突)
static修饰函数:静态函数只能在声明所在的文件内部调用,无法被其他文件调用

#include <stdio.h>

char ch = 'b';//全局变量

void func(const int a/*如果在该函数中不想修改此形参变量则用const修饰*/, int b)//形参
{
    int num = 123;
    printf("%s\n", __func__);//打印函数名
    printf("%c\n", ch);//可调用全局变量
    int ch = 'a';
    printf("%c\n", ch);//调用的是局部变量
    printf("%c\n",::ch);//用"::"在重名时访问全局变量
}

void func1()
{
    static int i=0;
    i++;
    printf("访问func1的次数为%d\n", i);
}


int main()
{
    int a = 9+'1';//局部变量
    const int b = 9;
    //b = 1;报错
    //const int c;报错,const变量要初值
    func(1, 2);
    func1();
    func1();
    printf("a=%c\n", a);
    //可以看到i没有重置哦

    return 0;
}

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。