Int I 既是声明变量也是定义变量
Extrn int I 只声明变量,不定义变量
变量占据空间,这个变量才存在,定义变量时,必须分配空间,而声明变量不会给变量分配空间,声明变量只是扩展变量使用范围
引申自网络
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
变量的声明有两种情况:
- 1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
- 2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
- 除非有extern关键字,否则都是变量的定义。
extern int i; //声明,不是定义
int i; //声明,也是定义
来自 <http://www.runoob.com/cprogramming/c-variables.html>
一个变量可以声明若干次,但要保证声明的形式相同,告知编译器已经为其分配内存空间了,不需要再次分配,但变量只可以定义一次
计算机按地址操作,程序员按变量名操作,变量名称为符号地址
直接访问通过变量名实现,间接访问通过指针访问
字符串放在数组内不能使用赋值号,只能使用strcpy函数拷贝字符串,或者在初始化数组时进行赋值。或者定义指针变量 char *strp; strp="abc";
Char *strp="abc"
此方法使用指针变量存储字符串和用数组存储字符串,地址空间不同。
存储空间的划分:程序区:存放代码
静态存储区:没有显示初始化,默认值为0,用完会打扫。所有变量生命周期和程序的生命周期相同。存在性和可见性不一致,存在不可见。
动态存储区:没有显示初始化,默认值为垃圾值,不打扫空间,释放变量不是指取消空间内容,只是指将变量名和地址空间的联系取消。生命周期:函数的生命周期。动态变量不存在可见不可见。
动态局部变量地址不可返回,静态可以返回,因为地址空间没有释放。
常量放在代码区
内存为什么会泄露:用malloc ralloc calloc分配的空间,并没用free释放,会造成内存泄漏,即使程序结束了,空间还是被占据的
存储类型:auto、static、register、extern
register——寄存器类型的变量不存在内存中,而是存放在寄存器中,嵌入式开发里经常用寄存器类型的变量,受限制,之能是基本数据类型的设置为寄存器类型,比如整型,因为存放在cpu中,不是内存中,所以不能用&来获取变量地址。
static——静态类型(全局静态,局部静态)
全局变量声明成静态,不改变存储位置,生命周期,改变作用范围。使得全局变量作用范围限制在源文件中,即在其他文件中不可用。利于协作开发。
局部静态变量:局限于特定函数,但是出作用域后并不释放,在函数体内的 静态变量的值也能维持。可以把上次计算的值,带到下一次运算中。函数多次调用的时候,需要把上次运算的值带到下一次运算中。适合递归等计算。
静态存储类型不允许定义成寄存器类型的。
静态函数:限制使用范围,函数名在其他文件不可见。
const定义只读变量
Const int *a;int const*a;a=&b;b可以改,但是a不可以改。
Int* const a; *a可以改,但是a不可以改。必须在定义变量a时进行初始化。
Int const* const a;a是指向const int型的const指针,所以a和*a都不可以改。
extern:表明变量或函数的定义在别的文件中,下面用到的这些变量或函数是外来的,不是本文件定义的,提示编译器遇到此变量或函数时,在其它模块中寻找定义。extern不能引用被static定义过的变量。
下午:
关键字-struct结构体
传送的不是简单的字节流,是多种数据组合起来的整体,表现形式为结构体。构造类型,声明新的数据类型,只是创造新的类型,并没有给他分配空间。
结构体之间可以整体赋值,也是结构体变量整体操作的唯一情况,变量平常不能整体使用,只能单个元素使用,对结构体的操作是对其整体的操作,不是对元素的操作。
*是取内容运算符,
结构体成员也可以是指向本结构体类型的指针变量,
引用形式:结构体变量名.成员名 ->
前面是结构体变量名用“.”前面是指针,使用“->”
scanf和gets,输入数据时候两个数据分开默认三个分隔符:空格,tab,回车,如果用gets,只认回车。如果想要输入带空格的一段话,只能用gets。