linuxc学习记录

  • 关于局部变量和全局变量

变量分类:

局部变量

定义在函数体内部

未初始化,初始值为随机值

存储位置:栈区

生命周期:同函数共存亡

作用域:函数体内部

全局变量

定义在函数体外部

未初始化,初始值为0

存储位置:全局区

生命周期:同程序共存亡

作用域:整个程序

#include<stdio.h>
void func();
int a;//全局变量
int main()
{
    //验证生命周期
    func();
    func();
    func();
    func();
    func();
    //验证作用域
    //printf("main:a = %d\n",a);
    return 0;
}

void func()
{
    int b = 0;//局部变量
    a = a+1;
    b = b+1;
    printf(“a = %d b = %d\n”,a,b);
}                                                                                                

运行结果:

由上图可知,全局变量a影响全局,其值一直存在,作用域充满整个程序,生命周期与程序共存亡。

局部变量b,作用于函数内部,生命周期与其所在的函数挂钩,函数结束局部变量b的生命周期也会结束

  • 外部引用

a.c
#include<stdio.h>
extern int a;
int main()
{
    printf("a = %d\n",a);
    return 0;
}

b.c
int a = 10;

运行结果:

本次使用函数extern

当引用同一程序不同文件的变量时,通常添加extern修饰。

外部引用语句在全局,所引用的变量就可作用于所在文件。

如果引用语句在函数体内部,所引用的变量只能作用于所在函数。

  • 外部引用,使用static静态型 修饰局部变量

使用static修饰上面b.c中的a变量。

a.c
#include<stdio.h>
extern int a;
int main()
{
    printf("a = %d\n",a);
    return 0;
}

b.c
static int a = 10;

运行结果:

编译报错,程序中static是静态变量,extern是外部变量,二者冲突。

这个报错是因为static 这个限制了局部变量的作用域。

于是,可以修改为:

a.c
#include<stdio.h>
extern int a;
void fun();
int main(){
    fun();
    return 0;
}
b.c
#include<stdio.h>
static int a=10;
void fun()
{
    printf("a = %d\n",a);
}

运行结果:

  • 计算各数据类型占用空间的大小

#include<stdio.h>
int main()
{
    printf("sizeof(char)=%d\n",sizeof(char));
    printf("sizeof(int)=%d\n",sizeof(int));
    printf("sizeof(short)=%d\n",sizeof(short));
    printf("sizeof(long)=%d\n",sizeof(long));
    printf("sizeof(float)=%d\n",sizeof(float));
    printf("sizeof(double)=%d\n",sizeof(double));
    return 0;
}

运行结果:

  • 内存分区

内存分为四个区域:堆、栈、全局/静态存储区、只读区(常量区和代码区)。

4G

内核占用

3G

栈区 :存储局部变量,由系统自动分配自动释放

----------------------------------------------------

堆区 :由用户手动申请(malloc)手动释放(free)的空间

----------------------------------------------------

全 .bss 存放未初始化的全局变量和静态变量

局 -------------------------------------------------

区 .data 存放已初始化的全局变量和静态变量

----------------------------------------------------

常量区 :存放常量(字符串常量等...)

----------------------------------------------------

代码段 :存放用户代码

0

  • 全局变量和局部变量能否重名

可以重名。在函数内访问数据时以函数内部的局部变量值为准。

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

因为局部变量相较于printf近,故输出代码内的num=10

  • 同一程序不同文件中的全局变量能否重名?

全局变量都可作用于整个程序,因此不得重名。

  • 强制类型转换

代码示例

#include <stdio.h>
int main()
{
    int a = 10 ,b = 2;
    float num = (float)a/b;   //将ab的int类型,强转为float类型
    printf("%f\n",num);
    return 0;
}

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值