作用是什么?其修饰的变量在内存中如何存储的?
static意为静态,可以修饰局部变量、全局变量、函数。
**修饰局部变量:**局部变量是在函数体内定义的变量,普通的局部变量存在内存的栈区,函数调用完后,这个变量就会被销毁,下一次调用时,原来赋予的值就不存在了。
如果利用static去修饰局部变量,在已初始化的static局部变量就会被存放到内存数据段的data区中,没有被初始化的static局部变量会被放到数据段的bss区中。
所以如果我们希望多次使用一个局部变量且保持它的值不会丢失的话,就可以用static关键字修饰它,使它存储于静态区中。
**修饰全局变量:**全局变量是在函数体外定义的变量,无论是否初始化都存放在数据段中,没有初始化的就存放在数据段的bss区中,已初始化的就存放在数据段的data区中。
普通的全局变量,除了可以被本文件识别,还可以被本工程的其他文件识别,如果加上extern的话,它就可以被本工程文件的其他文件调用了。但是如果我们想在本工程的
其他文件定义同名的全局变量,就会出现冲突了,这个时候我们就可以使用static关键字去修饰这个全局变量,让它仅可以在本文件中识别和使用,不会影响其他文件定义同命变量。
**修饰函数:**变成静态函数,只能在声明它的地方可见。和全局变量类似,普通的函数可以被本工程的其他文件识别,如果再想在本工程下的其他文件定义同名的函数,就会出现冲突。
数组:是可以存储相同数据类型的一片连续内存空间,函数名指向这段内存空间的首地址。
**指针数组:**是一个数组,所有数组元素为指针,存放的是地址。指针的大小由系统决定(即数组元素的占用内存大小固定),在32位系统中,指针占4个字节,在64位系统中,指针占8个字节。int array[]是存放整型的数组,char array[]是存放字符型的数组,float array[]是存放浮点型的数组,int *array[]是存放整型指针的数组,char *array[]是存放字符指针的数组。
指针:是一种变量,和其他变量不同的是,其指向某个内存空间的首地址。
**数组指针:**是一种指针,指向数组首地址的指针变量,长度固定,由操作系统决定。
指针数组的定义:
int *array[5];
其中数组元素array[0],array[1],array[2]…都指向某个地址,可结合下图理解。
数组指针的定义:
int (ptr)[5];
ptr指向的数组首地址,数组有五个元素,可结合下图理解。注意:[]的优先级比高,在定义数组指针的时候必须加括号使得*和ptr先结合。
关键在于看我们怎么使用。
1.可以,在不同的.c文件中使用static对该全局变量进行声明,前提是只在其中一个.c文件对该变量进行赋值,这时连接不会出错。
为什么要声明为static的原因如下:
每个.c⽂件,会编译成⼀个obj,如果在头⽂件中定义,⽽不是声明,那么每个引⽤这个头⽂件的obj中都会有⼀个这个变量的实例,连接的时候就会报重复定义出错了。
static使得该全局变量只在本文件中有效。
**2.不可以,**程序在编译时,#include头文件的内容会完整导入.c文件中,包括被定义在头文件的全局变量,这就会使得这个全局变量被重定义,造成编译出错。
解决办法:
我们都知道变量和函数的定义最好写在.c文件中,而变量和函数的声明才放到头文件中。可将全局变量定义在被多次使用的某个C文件,在头文件中庸extern关键字进行外部变量声明,这样其他.c文件就可以使用该全局变量了。