关于C语言关键字的梳理总结
volatile常用在:
1). 硬件寄存器(如:状态寄存器)。
2). 中断程序中会访问到的非自动变量(Non-automatic variables)。
3). 多线程应用中几个任务共享的变量
使用volatite的好处是避免变量的值能会被意想不到的修改,对该变量的操作
将不作优化,用到该变量时都从这个变量的原始地址读取。volatile 可以保证对
特殊地址的稳定访问。
extern:在其它程序模块中说明了全局变量
extern在其他源程序中也可以使用;
static只能在本程序中使用。
如果加了static,就会对其它源文件隐藏。
例如在a和actor的定义前加上static,main.c就看不到它们了
static变量存放在静态存储区,所以它具备持久性和默认值0。
static关键字至少有下列n个作用:
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
const:
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:
const classA operator*(const classA& a1,const classA& a2);
operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:
classA a, b, c;
(a * b) = c; // 对a*b的结果赋值
操作(a * b) = c显然不符合编程者的初衷,也没有任何意义。
1)int const *p //const 修饰*p(指针),*p是指针指向的对象,不可变。
2)const int *p //同上
3)int *const p // p不可变,p指向的对象可变
数组指针和指针数组
int (*p)[10] //数组指针,指向一个数组,
int *p[10] //[]的优先级比*高,指针数组。包含十个指向int类型数据指针。
结构体和联合体
内存对齐问题
结构体:与成员大小,排列顺序有关系。
联合体;只配置一个足够大的空间来容纳最大长度的数据成员。
动态内存分配
malloc 内存分配;
free 内存释放
menset 内存清零
memcpy 内存拷贝
strcmp区别 memcpy内存里的可以全拷贝,而strcmp拷贝一些遇到/0会结束。
回调函数和钩子函数
变量只有在定义以后才可以使用。
int fun()
{
......
}
int fun()
{
……
}
int x,y;
int fun1(int a, int b)
{|
x= a+b;
pritnf("%d",x);
}
int main()
{
int i=10;
int j= 20;
fun();
fun1(i,j);
y=i-j;
printf(“%d”,y);
}
从上例可以看出x、y都是在函数外部定义的外部变量,都是全局变量。但x,y定义在函数fun之后,而在fun内又无对x,y的说明,所以它们在fun内无效。而x,y定义在fun1、main前面,因此在fun1及main内不加说明也可使用。想要在fun使用x、y,可以在fun前面添加语句: extern int x,y;
下面是a.c的内容
char a = 'A'; // global variable
void actor()
{
printf("Hello\n");
}
下面是main.c的内容
int main(void)
{
extern char a; // extern variable must be declared before use
printf("%c ", a);
actor();
return 0;
}
说明变量x、y在程序中已经定义,可以使用。
全局变量是使用相同的内存块在整个类中存储一个值。