初中网站建设,怎样用织梦建设网站,网站建设公司网站制作,软件下载安装免费一、关键字static、const、extern、volatile作用
1、const
1.修饰常量
用const修饰的变量是不可变的#xff0c;修饰后的变量只能使用#xff0c;不能修改。
2.修饰指针
如果const位于*的左侧#xff0c;eg#xff1a;const int* a#xff0c;则const就是用来修饰指针…一、关键字static、const、extern、volatile作用
1、const
1.修饰常量
用const修饰的变量是不可变的修饰后的变量只能使用不能修改。
2.修饰指针
如果const位于*的左侧egconst int* a则const就是用来修饰指针所指向的变量此时为常量指针即指针指向*a为常量 如果const位于*的右侧egint* const aconst就是修饰指针本身此时为指针常量即指针本身a是常量。
const int* p a; // 常量指针指针指向的内容不能变*p不能变
int* const p a; // 指针常量指针本身不能变 p不能变
3.修饰函数参数
用const修饰函数参数传递过来的参数在函数内不可以改变。
void func (const int n)
{n 10; // 编译错误
}
2、static (静是一种约束不能乱跑乱动)
1.修饰变量
1修饰局部变量
局部变量没有被static修饰 存储在栈中 自动初始值不固定
局部变量被static修饰 叫做局部静态变量存储在全局数据区 初始化为0
代码运行分析
子函数变量中不加static进行修饰
#include stdio.hvoid test()
{static int a 0;a;printf(%d , a);
}
int main()
{int i 0;for (i 0; i 8; i){test();}return 0;
} 子函数中加static进行修饰
#include stdio.hvoid test()
{static int a 0;a;printf(%d , a);
}
int main()
{int i 0;for (i 0; i 8; i){test();}return 0;
} 2修饰全局变量
全局变量定义在函数体外部在全局数据区分配存储空间且编译器会自动对其初始化。 全局变量没有被static修饰 整工程所有文件可以用这个全局变量其它文件使用时候需要extern外部声明也就是说其他文件不能再定义一个与其相同名字的变量了否则编译器会认为它们是同一个变量。
全局变量被static修饰静态全局变量仅对当前文件可见其他文件不可访问其他文件可以定义与其同名的变量两者互不影响。
static定义全局变量的作用在定义不需要与其他文件共享的全局变量时加上static关键字能够有效地降低程序模块之间的耦合避免不同文件同名变量的冲突且不会误使用。
2.修饰函数
在函数的返回类型前加上static就是静态函数。
静态函数只能在声明它的文件中可见其他文件不能引用该函数不同的文件可以使用相同名字的静态函数互不影响。
非静态函数可以在另一个文件中直接引用甚至不必使用extern声明。
3.C面向对象中static用法
(1)类内静态数据成员
作用实现多个对象共享数据的目标。
static 成员变量属于类不属于某个具体的对象即使创建多个对象也只为 m_total 下面程序中分配一份内存所有对象使用的都是这份内存中的数据。当某个对象修改了 m_total也会影响到其他对象。
class Student{
public:Student(char *name, int age, float score);void show();
public:static int m_total; //静态成员变量
private:char *m_name;int m_age;float m_score;
};
(2)使用方法
初始化静态成员变量
static 成员变量的内存既不是在声明类时分配也不是在创建对象时分配而是在类外初始化时分配。反过来说没有在类外初始化的 static 成员变量不能使用。
int Student::m_total 0;
静态成员变量访问
static 成员变量既可以通过对象来访问static 成员变量不占用对象的内存而是在所有对象之外开辟内存即使不创建对象也可以访问。具体来说static 成员变量和普通的 static 变量类似都在内存分区中的全局数据区分配内存。
//通过类类访问 static 成员变量
Student::m_total 10;
//通过对象来访问 static 成员变量
Student stu(小明, 15, 92.5f);
stu.m_total 20;
//通过对象指针来访问 static 成员变量
Student *pstu new Student(李华, 16, 96);
pstu - m_total 20;
3、extern
1.修饰变量
若一个变量需要在同一个工程中不同文件里直接使用或修改则需要将变量做extern声明。只需将该变量在其中一个文件中定义然后在另外一个文件中使用extern声明便可使用但两个变量类型需一致。
方式一
在1.c中定义全局变量
int i; 在2.c和3.c中都用
extern int i;声明一下就可以使用了
方式 二
在头文件a.h 中声明
extern int i; 在其他某个c文件中定义
int i 0; 其他要使用i变量的c源文件只需要includea.h就可以
2.修饰函数
在定义函数时如果在函数首部的最左端冠以关键字extern则表示此函数是外部函数可以供其他文件调用。C语言规定如果在定义函数时省略extern则隐含为外部函数。在文件中要调用其他文件中的外部函数则需要在文件中用extern声明该外部函数然后就可以使用。
和定义全局变量 方式二比较相同呢。
4、volatile
1.修饰变量
编译器对访问该变量的代码就不再进行优化从而可以提供对特殊地址的稳定访问这点在单片机这种存储器有限制的程序中需要注意。
声明时语法
int volatile vInt;
volatile int i10;
int a i;
...
// 其他代码并未明确告诉编译器对 i 进行过操作
int b i;
当要求使用 volatile 声明的变量的值的时候系统总是重新从它所在的内存读取数据即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
volatile 指出 i 是随时可能发生变化的每次使用它的时候必须从 i的地址中读取因而编译器生成的汇编代码会重新从i的地址读取数据放在 b 中。而优化做法是由于编译器发现两次从 i读数据的代码之间的代码没有对 i 进行过操作它会自动把上次读的数据放在 b 中。而不是重新从 i 里面读。这样以来如果 i是一个寄存器变量或者表示一个端口数据就容易出错可能某些寄存器值被中断程序改变所以说 volatile 可以保证对特殊地址的稳定访问。 参考文章
c语言中static关键字用法详解_static在c语言中的用法_guotianqing的博客-CSDN博客
C static静态成员变量详解 (biancheng.net) 二、内存分配堆和栈
1、堆和栈
1.栈stackstand
我叫它客栈人来人往只是大家伙变量临时休息的地方。
2.堆heap 2、内存分配
1、一个C/C编译的程序占用内存分为以下5个部分
栈区stack由编译器自动分配与释放存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。堆区heap一般由程序员自动分配如果程序员没有释放程序结束时可能有OS回收。其分配类似于链表。全局区静态区static存放全局变量、静态数据、常量。程序结束后由系统释放。全局区分为已初始化全局区data和未初始化全局区bss。
代码区存放函数体类成员函数和全局区的二进制代码。常量区文字常量区存放常量字符串程序结束后有系统释放。 参考文章
C/C程序内存的分配_c内存分配_cherrydreamsover的博客-CSDN博客
C语言内存分配 - 知乎 (zhihu.com)
C语言的内存分配{静态内存动态内存堆栈}_c语言内存_梅尔文的博客-CSDN博客