C语言(一 数据类型、储存类、分配空间)

C语言是一种移植性强,面向过程的语言,最初由丹尼斯创立,用于编写UNIX操作系统,移植性强指的是它的代码通用性强。

特点:操作简易,结构化语言,适合处理底层事件。

我的第一个C语言程序

#include <stdio.h>  /*预处理器指令,在实际编译之前执行的*/
int main{               /*程序主函数*/
	printf("Hello World!\n");       /*输出*/
	return 0;
	}
	

标识符
用来标识变量或者用户自定义的内容,以大小写字母或下划线_开头,后面加上其它字符,不含$,%,@。

数据类型
是用来标识变量类型的系统,也是用来决定变量储存占用的空间大小以及储存的位模式。

数据类型
:基本类型(整数类型,浮点数类型)、枚举类型(一些只能被赋予离散整数类型的变量)、派生类型(数组,共用体、函数、指针,结构)。可以用sizeof()来看一下这些类型储存所占的字节大小。char:1字节(8位),int和float:4字节,double:8字节,long double:16字节。

float单精度浮点
1个小数点,8位指数,23位小数

double双精度浮点
1个小数点,11位指数,52位小数

字符型常量用单引号‘a’ 、 字符串用双引号“sad”,储存在数组中

类型自动转换规则
1、整型赋给浮点型:数值不变,保存为浮点类型
2、浮点类型赋给整型,去掉小数点后数值,只保存整数。

变量的声明有两种情况:

1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
除非有extern关键字,否则都是变量的定义。

extern int i; //声明,不是定义
int i; //声明,也是定义

C 中的左值(Lvalues)和右值(Rvalues)

1、左值:指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
2、右值:术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

常量
两种方式定义常量
const其实不是定义,而是改变一个变量的存储类,把该变量所占的内存变为只读

#define LONG 2    //预处理
const int HANG 5   // 编译

C语言储存类
auto 只能在函数内使用,修饰局部变量
register 修饰变量,可能储存在寄存器内,取决于硬件情况
static 修饰局部变量或者全局变量,修饰局部变量可以保证函数间调用变量的值不变,修饰全局变量可以把作用域控制到该文件内。
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 ‘extern’ 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。

C 语言中全局变量、局部变量、静态全局变量、静态局部变量的区别
作用域看:

1、全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。

2、静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

3、局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。

4、静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

分配内存空间看:

1、全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

2、全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

1)静态变量会被放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2)变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

Tips:

A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带"内部存储器"功能的的函数)
E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

猜你喜欢

转载自blog.csdn.net/weixin_42927264/article/details/82852947