首页 > 其他分享 >C语言学习 --- 修饰变量的关键字

C语言学习 --- 修饰变量的关键字

时间:2024-09-09 19:52:37浏览次数:3  
标签:10 const 变量 指向 int C语言 --- 关键字 修饰

修饰变量的关键字

        修饰变量的关键字+数据类型+变量名

 auto:自动默认不写

register:

        register是作为寄存器的变量,就是在CPU里面存储的地方

作用:

        将频繁进行IO操作的变量声明成寄存器变量,节省数据读取操作的时间,提高执行效率。

register int i;
for(i=1;i<100000;i++)
{
    printf("%d",i);
}

注意:

寄存器的数量有限,当寄存器用完时,即使声明了变量也会被看做普通变量。

当编译器检测到频繁的IO操作,且寄存区有空闲,会自动将变量提升为寄存器变量。

static:

作用:

一、修饰局部变量

1、修饰局部变量时,只会初始化局部变量一次。

2、在函数结束时static局部变量的空间不会被销毁。

3、依旧只能在在定义的函数中使用。

二、修饰全局变量

1、只能在当前文件(模块)中使用。

2、普通的全局变量分模块的时候,要想在别的模块中使用,可以使用extern声明:extern 数据类型 变量名;

3、static全局变量分模块的时候,不能在别的模块中使用,只能在当前文件使用。

三、修饰函数

        static全局变量只能在当前文件(模块)中使用。

例子:
void test(void)
{
    static int a = 1;
    printf("%d\r\n",a);
    a++;
}

int main()
{
    test();
    test();		//第二次运行,遇到静态变量初始化忽略这条语句				
    return 0;
}
场景:
流水灯

void flash(void)
{
    static int n = 1;
    printf("%d灯亮\r\n",n);
    n++;
    
    if(n>5)
    {
        n = 1;
    }
}
int main()
{
    while(1)
    {
        flash();
        //延迟
        sleep(0.5);
    }
}

const:

作用:

        只读的意思,修饰的空间内只能读不能写。且修饰的变量必须初始化。

区分:

1、const int *p;

const在*前面修饰*p,不能通过p修改其所指向的const int的值(如*p=20)。

但是可以修改常量指针p的指向(如p=&b)。

const int *p;		//const在*前面修饰*p,不能通过*p修饰指向空间的数据。但p本身是可修改的。
#include <stdio.h>  

int main() {  
    const int a = 5;  
    const int b = 10;  
    const int *p = &a; // p 指向 a  
  
    // 尝试通过 p 修改它所指向的整数值(这是不允许的)  
    // *p = 20; // 编译错误:不能通过 p 修改它所指向的 const int 值  
  
    // 但是 p 本身的值(即它指向的地址)是可以被修改的  
    p = &b; // 现在 p 指向 b  
  
    // 读取 p 指向的值  
    printf("%d\n", *p); // 输出:10  
  
    return 0;  
}
2、int *const p = &a;

const在*后面修饰的是p,指针指向不能变量。要立刻给地址。

但是可以通过p修改它指向的整数值(如*p=10)。

int *const p = &a;		//const在*后面修饰的是p,指针指向不能变量。要立刻给地址,否则后面用不了

#include <stdio.h>  

int main() 
{  
    int a = 5;  
    int *const p = &a; // p 是一个指向 int 的常量指针,指向 a  
  
    // 尝试修改 p 指向的地址(这是不允许的)  
    // int b = 10;  
    // p = &b; // 编译错误:p 是常量指针,不能改变其指向  
  
    // 通过 p 修改它所指向的整数值(这是允许的)  
    *p = 10; // 现在 a 的值被修改为 10  
    printf("%d\n", a); // 输出:10  
  
    return 0;  
}
3、const int * const p = &a;

p和*p只读的。

不能通过p修改它指向的const int的值。

也不能通过常量指针p改变指向。

const int * const p = &a;// p和*p只读的。

#include <stdio.h>  

int main() {  
    int a = 5;  
    const int * const p = &a; // p 是一个指向 const int 的常量指针,指向 a  
  
    // 尝试通过 p 修改它所指向的整数值(这是不允许的)  
    // *p = 10; // 编译错误:不能通过 p 修改它所指向的 const int 值  
  
    // 尝试改变 p 指向的地址(这也是不允许的)  
    // int b = 10;  
    // p = &b; // 编译错误:p 是常量指针,不能改变其指向  
  
    // 但你可以读取 p 指向的值  
    printf("%d\n", *p); // 输出:5  
  
    return 0;  
}

const int a = 10;   //写操作会报错
int const a = 10;	//和上书定义时一样的,没有区别。

面试题:
    const int *p和int const *p	---> 没有区别。

面试题2:
    区分:const修饰哪一个空间,哪一个空间是只读的

volatile:

作用:

1、内存访问,编译器可以直接从内存中读取volatile修饰变量的值。

2、组织编译器优化,修饰的变量会被改变,使程序可以读到新的值。

#include<stdio.h>

// 延迟函数
void delay(void)
{
    volatile int i,j;
    for(i=0;i<100000;i++)
    {
        for(j=0;j<100000;j++)
        {
            
        }		
    }	
} 

int main(void)
{
    printf("hello");
    delay();
    printf("world");
    return 0;
}

extern:

        用于声明外部变量,也可以作为函数的声明。

2、动态内存申请

作用:

需要空间的时候申请,使用完可以将空间释放。

mallloc:

申请空间的函数

#include <stdlib.h>

void *malloc(size_t size);

功能:

在堆区申请size个字节大小的空间,将首地址返回。

且malloc申请的空间没有类型,要用地址承接且用强转符保持等号两边类型一致。

如int *p=(int *)malloc(sizeof(int));

释放空间:

free(指针名); // 指针指向的空间

p = NULL; //为了避免野指针

注意:

单片机内如果没有内存管理模块(MMU),则不能用动态内存申请。

标签:10,const,变量,指向,int,C语言,---,关键字,修饰
From: https://blog.csdn.net/weixin_60945116/article/details/142067664

相关文章

  • Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制
    文章目录Java代码审计篇|ofcms系统审计思路讲解-篇1|环境搭建、路由机制1.前言2.项目环境搭建3.项目路由机制3.1.1)先搜索pom.xml文件,看看使用了什么框架3.2.2)确定是否是spring的路由机制3.3.3)确定自写路由机制的特点3.4.4)从前端探索3.5.5)断点调试3.6.6)寻......
  • 【Leetcode算法面试题】-1. 两数之和
    文章目录算法练习题目思路参考答案算法1算法2算法3算法练习面试经常会遇到算法题目,今天开启算法专栏,常用算法解析题目**给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设......
  • 【模板题】二分法 - 34. 在排序数组中查找元素的第一个和最后一个位置
    题目链接34.在排序数组中查找元素的第一个和最后一个位置思路二分法题解链接【视频讲解】二分查找总是写不对?三种写法,一个视频讲透!(Python/Java/C++/C/Go/JS)关键点模板题;应当熟练掌握时间复杂度\(O(\logn)\)空间复杂度\(O(1)\)代码实现:#闭区间d......
  • 深入理解java虚拟机---第 3 章 垃圾收集器与内存分配策略
    3.2.2可达性分析算法当前主流的商用程序语言(Java、C#,上溯至前面提到的古老的Lisp)的内存管理子系统,都是通过可达性分析(ReachabilityAnalysis)算法来判定对象是否存活的。这个算法的基本思路就是通过一系列称为“GCRoots”的根对象作为起始节点集,从这些节点开始,根据引用关......
  • 代码随想录day9-栈和队列1
    题目1232.用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的元素booleanempty()如......
  • [MX-X3-T5 & RiOI-4] Countless J-Light Decomposition Solution
    看题以为自己会了,写代码的时候发现有细节没考虑清楚,复杂度写挂了以为被卡常了,调用并查集函数还手残打错了,浪费大半个下午。NOI之后属于越训越菜了QwQ。回到这个题,首先这个题当\(i\)固定时做法是显然的,我们自底向上考虑,每次一定是ban掉连向当前最长链最大子树的\(i\)条边......
  • ArmSoM-Sige5 的 RK3576 SoC 主线内核支持进展
    我们很高兴地宣布,基于RK3576SoC的ArmSoM-Sige5开发板的主线内核支持,collabora正在稳步推进中。RK3576SoC是Rockchip家族的一员,其设计和功能与广受欢迎的RK3588相似,许多硬件模块都得到了复用,这为我们在主线内核中添加支持提供了有利条件。 RK3576主线内核支持概况​......
  • 【最新华为OD机试E卷-支持在线评测】通过软盘拷贝文件(200分)多语言题解-(Python/C/Ja
    ......
  • chapter13-常用类——(Date、Calendar、LocalDate)—day17
    目录488-Date介绍489-Date应用实例490-Calendar介绍491-Calendar应用实例492-第三代日期使用493-第三代日期方法494-String翻转495-注册处理题496-字符串统计497-String内存布局测试题488-Date介绍IDEA里面的properties是set/get方法489-Date应用实例4......
  • SciTech-Mathmatics-Probability+Statistics-Population-Sampling-Population vs. Sam
    Difference:Populationvs.SampleBYZACHBOBBITTPOSTEDONNOVEMBER27,2020Ofteninstatisticswe'reinterestedincollectingdatasothatwecananswersomeresearchquestion.Forexample,wemightwanttoanswerthefollowingquestions:Whatis......