两种变量、四种存储类以及他们的存储区、生存期与作用域....

一、两种变量
局部变量:在函数内部定义
全局变量:在函数外部定义
二、 四种存储类
auto (自动类型):
修饰局部变量auto int a;
平时定义的变量都是自动变量,auto可以省略 , 没有赋初值为随机数 ,栈空间存放 ,从定义位置开始,到当前代码块结束,即局部变量用完就释放 ,作用于当前代码块。

register (寄存器类型):
修饰局部变量 register int a;
平时的变量都保存在栈中,如果有一些数据需要频繁存取,将数据存储到寄存器中,方便存取。

static (静态):
①修饰局部变量 ,static int a;
这个变量只会被初始化一次,存放在静态数据段,从定义位置开始到整个程序将结束,作用域为当前代码块,修饰全局变量 ,在全局变量的定义之前加static修饰,这个变量只能本当前文件使用,就算其他文件extern声明也不能使用。
②修饰函数 ,在函数定义之前加static
这个函数只能被当前文件下的函数调用,不能被其他文件调用,就算其他文件进行了extern声明。

extern (外部):
①修饰全局变量
定义一个全局变量,存在静态区域,当前代码结束才会释放空间 ,作用域本文件,其他文件不能使用。默认没有外部链接属性,如果其他文件要是用本文件的全局变量的话,要进行extern声明。
②修饰函数
如果函数的定义在其他文件中,需要先外部声明函数,就可以调用其他文件中的函数。

链接:
一个具有外部链接的变量可以在一个多文件程序的任何地方使用;一个具有内部链接的变量可以在一个文件的任何地方使用。
int giant=5; //文件作用域,外部链接
static int dodgers=3; //文件作用域,内部链接

三、堆空间 主动申请主动释放

#include <stdlib.h>

void *malloc(size_t size);    //在堆空间中申请size个字节大小空间,返回这块空间的首地址
//int *  char *
//void *:通用类型地址  相当于一级指针
//void **

int a=10;
int *p=(int *)malloc(4);   //在堆空间定义一个int

int a[10];
int *p=(int *)malloc(40);  //在堆空间定义一个int数组

char ch[20];
char *p=(char *)malloc(20);  //在堆空间定义一个char数组





void free(void *ptr);   //释放堆空间
void *calloc(size_t nmemb, size_t size);  
//在堆空间中申请nmemb块,每块size个字节大小的堆空间,返回首地址,对申请的空间清空为0

/*
    int a[10];
    int *p=(int *)malloc(40);
    int *q=(int *)calloc(10,sizeof(int));  //便于代码可读性
*/


void *realloc(void *ptr, size_t size);  //修改ptr指向的堆空间的大小变为size个字节
/*
    int a[10];          //数组长度固定,不能改变
    int *p=(int *)malloc(40);   //在堆空间定义int数组
    p=realloc(p,80);   //把数组长度扩充          //动态数组:数组长度可变

*/

例1:验证局部变量的生存期

#include <stdio.h>

int *fun(void)
{
    //static int a;      //代码正确
    int a;               //代码错误,局部变量a,当前代码块结束就释放,所以当函数调用结束,a就释放了,在主函数中不能使用a
    a=10;
    return &a;
}

int main(void)
{
    int *p=fun();
    *p=20;              //错误

    printf("%d\n",*p);
    return 0;
}

例2:验证局部变量的生存期与作用域

#include <stdio.h>

int a=100;
int b=200;

int main(void)
{
    printf("%d %d\n",a,b);
    int a=10;
    int b=20;

    {
	int a=5;
	int b=6;
	int c=30;
	printf("%d %d %d\n",a,b,c);           //变量使用,往上找定义语句。
    }

    printf("%d %d\n",a,b);
    return 0;
}

例3:static修饰局部变量 这个局部变量只能被初始化一次

#include <stdio.h>

void fun(void)
{
    static int a=1;   //虽然多次调用这个函数,但这句话只会在第一次调用的时候执行.
    a++;

    printf("%d\n",a);
}

int main(void)
{
    int i;
    for(i=0;i<10;i++)
    {
    
	fun();
    }

    return 0;
}

例4:演示多个编译单位

main.c

#include <stdio.h>

int main(void)
{
    fun();

    return 0;
}

fun.c

#include <stdio.h>

void fun(void)
{
    printf("i am fun!\n");

}

gcc main.c fun.c -o main
./main

例5:static与extern修饰函数

main.c

#include <stdio.h>

extern void fun(void);

int main(void)
{
    fun();

    return 0;
}

fun.c

#include <stdio.h>

static void fun(void)
{
    printf("i am fun!\n");

}

例6: static与extern修饰全局变量

main.c
#include <stdio.h>
static int a=10;

int main(void)
{
    fun();

    printf("%d\n",a);
    return 0;
}

fun.c
#include <stdio.h>
extern int a;

void fun(void)
{
    printf("%d\n",a);
    a=20;

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

}

例7: 实验堆空间申请与释放函数

#include <stdio.h>
#include <stdlib.h>

int *fun(void)
{
    //int a=10;
    int *p=(int *)malloc(sizeof(int));
    return p;
}

int main(void)
{
    int *p=fun();
    *p=20;

    free(p);
    printf("%d\n",*p);

    //free(p);
    return 0;
}

四、宏定义
编译预处理命令行:以#开头的行 宏定义 文件包含 条件编译 …
1、没有参数的宏
#define 宏名 替换文本 //在文件起始位置函数之外定义,没有;结尾
宏名 : 名字,变量名的规则 一般大写
替换文本 : 宏所代表的的内容

#define N 10
#define QQQ printf(“i love you”)
#define QQQ printf(“i love you!\n”);printf(“marry me!\n”);printf(“do you?\n”)

1#include <stdio.h>
#define N 10

void fun(int *p)
{
    int i;
    for(i=0;i<N;i++)
    {
	p[i]=0;
    }

}

int main(void)
{
    int a[N];
    fun(a);

    int i;
    for(i=0;i<N;i++)
    {
	printf("%d  ",a[i]);
    }

    return 0;
}

2 、带参数的宏
#define 宏名(参数) 替换文本
#define PRINT(a) printf("%d\n",a)
要注意参数最好每个都用小括号括起来

3 、宏替换 :
它与函数调用的方法不同 ,先把宏的替换文本替换对应的宏的位置,然后把参数一一替换.
#include <stdio.h>
//#define SUM(a,b) ab
//#define SUM(a,b) (a)
(b)
#define SUM(a,b) ((a)+(b)) //最安全的写法

int main(void)
{
    int x=10;
    int y=20;
    int ret=SUM(x+y,y);   //(x+y)*(y)
    printf("%d\n",ret);

    return 0;
}

4 、预定义符号

#include <stdio.h>

int main(void)
{
    printf("%s\n",__FILE__);
    printf("%d\n",__LINE__);
    printf("%s\n",__FUNCTION__);
    printf("%s\n",__DATE__);
    printf("%s\n",__TIME__);

    return 0;
}


//system()   //执行一个shell命令  system("clear");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领,每个领都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值