C语言学习之关键字第一讲

美国国家标准协会ANSI(American National Standards Institute)C标准C语言共有32个关键字,关键字由系统定义,不能重做其它定义。

    1.auto 声明自动变量 只在定义它们的时候才为变量创存储空间,在定义它们的函数返回时系统回收变量所占存储空间。对这些变量存储空间的分配和回收是由系统自动完成的。一般情况下,不作专门说明的局部变量,均是自动变量。自动变量也可用关键字auto作出说明,如今可以省略关键字auto所以很少使用此关键字。自动变量只有一种存储方式,就是存储在中。由于自动变量存储在栈中,所以自动变量的作用域只在函数内,其生命周期也只持续到函数调用的结束。

               什么是自动变量呢?自动变量就是指在函数内部定义使用的变量。他只是允许在定义他的函数内部使用它。在函数外的其他任何地方都不能使用的变量。自动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这说明自动变量也没有链接性,因为它也不允许其他的文件访问他。由于自动变量在定义他的函数的外面的任何地方都是不可见的,所以允许我们在这个函数外的其他地方或者是其他的函数内部定义同名的变量,他们之间不会发生冲突的。因为他们都有自己的区域性,而且它没有链接性(即:不允许其他的文件访问他的)。

           void function(void)

           {

               auto int  a;  //定义一个整数型自动变量 a未赋初值则当程序执行到此函数时先为a分配堆栈存储空间局部变量不赋初值时系统随机分配当时存                                  //储空间当时的值全局变量和局部静态变量的话赋初值为0

               auto int b=1;//此处只比上一句多了一个赋初值,

               int c;          //这里的auto省略标准c里省略关键字当成auto处理此处未赋初值

               int d=1;      //

           }//当退出此函数后自动变量存储空间被收回,同时在此函数外不可用且在其他函数内可以定义同名变量,自动变量作用域仅在函数内部

     2.static       声明静态变量

     3.register   声明寄存器变量

寄存器变量的定义形式是:

register 类型标识符 变量名

寄存器是与机器硬件密切相关的,不同类型的计算机,寄存器的数目是不一样的,通常为2到3个,对于在一个函数中说明的多于    2到3个的寄存器变量,C编译程序会自动地将寄存器变量变为自动变量由于受硬件寄存器长度的限制,所以寄存器变量只能是    char、int或指针型。寄存器说明符只能用于说明函数中的变量和函数中的形参,因此不允许将外部变量或静态变量register

/* 程序1 */

main ( )

{

register int temp, i;

for ( i=0; i<=30000; i++ )

for ( temp=0; temp<=100; temp++ ) ;

printf ("ok\n");

}

/* 程序2 */

#include <stdio.h>

main( )

{

int temp, i;

for ( i=0; i<=30000; i++ )

for ( temp=0; temp<=100; temp++ ) ;

printf ("ok\n");

}

这种变量一般执行速度快,因为直接从硬件寄存器取数据这两个程序中,前者使用了两个寄存器变量,后者使用了两个自动变量程序除此之外完全一样。但运行时感觉的执行速度是不同的,前者使用寄存器变量的程序要比后者使用自动变量的程序要快。(如果在Tubro C的环境下运行程序2,则应该将编译器优化选项"use register variable"开关关上(OFF),否则,编译器自动优化程序使用寄存器,两个程序会得到相同的结果。)由于register变量使用的是硬件CPU中的寄存器,寄存器变量无地址,所以不能使用取地址运算符"&"求寄存器变量的地址。以上register一段来自网络。

    4.extern       声明变量是在其他文件中声明

*************************************这里对四种变量声明做一下自己的总结详细参照如下链接*********************************************

1.按照作用域分可分成:局部变量,全局变量。按照生命周期分可分成:静态变量,动态变量。按照存储位置分则可存储于堆,栈,程序存储器,数据存储器,寄存器。

局部变量:则是auto关键字声明的或者省略关键字作用域仅限函数内,存储于栈,退出函数变量内存释放,同时可以在此函数外定义相同变量名不会出错。

局部静态变量:则是由static关键字声明的变量,作用域仅限函数内但是全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,退出函数时数值保留成最新更新的值整个程序运行周期都存在。未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

全局变量:全局变量定义于函数之上,可以被定义处以下所有函数调用(即同文件),存储同静态变量,若在其他文件中使用则需要加extern则说明此处使用的时全局变量且在其它文件已经声明。同时对于静态变量和全局变量未初始化时系统默认赋值为0而局部变量不赋初始值则由分配内存时当时随机值决定。

全局静态变量:此变量与全局变量的唯一不同是在本文件外不可见,即在其他文件不能通过extern声明此全局变量。


参考资料相关连接如下

 存储类型auto,static,extern,register的区别

点击打开链接    

变量的生命周期与作用域

点击打开链接

(转)C语言中auto,register,static,const,volatile的区别

点击打开链接

static详解

存储位置详解

堆和栈详解

C语言的代码内存布局详解

以上都是本人理解,如有异议欢迎讨论,纠错。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的volatile关键字是用来声明一个变量为“易变”的。这意味着该变量的值可以在程序执行期间随时发生变化,可能由于硬件或者其他并行执行的线程的影响。使用volatile关键字可以告诉编译器不要对该变量进行优化,以确保每次访问该变量时都从内存中读取最新的值。这对于需要频繁读写硬件寄存器或者在多线程环境下共享的变量非常有用。 参考资料: C语言深度解析专栏—C语言关键字详解第五篇 C语言学习 -- 关键字volatile_聚优致成的博客-CSDN博客 更多关键字在下面博客链接 C语言关键字详解(一)auto、register关键字 C语言关键字详解(二)带你全面了解 static C语言关键字详解(三)数据类型与sizeof关键字 C语言关键字详解(四)带你全面了解 const 关键字<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C语言关键字详解(五)带你全面了解 volatile 关键字](https://blog.csdn.net/m0_62391199/article/details/123746218)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C语言volatile 关键字](https://blog.csdn.net/qq_58264156/article/details/127416196)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值