作用域
局部变量:函数内部定义的变量。
全局变量:函数外部定义的变量。
extern关键字
用于变量:
extern int a; // 声明一个全局变量 a
int a; // 定义一个全局变量 a
extern int a =0 ; // 定义一个全局变量 a 并给初值。
int a =0; // 定义一个全局变量 a, 并给初值。
用于函数:
/*fun.h*/
int fun(void); //函数声明,所以省略了extern,完整些是extern int fun(void);
/*对应的fun.cpp文件*/
int fun(void)
{
return 0;
}//一个完整的全局函数定义,因为有函数体,extern同样被省略了。
函数,对于函数也一样,也是定义和声明,定义的时候用extern,说明这个函数是可以被外部引用的,声明的时候用extern说明这是一个声明。 但由于函数的定义和声明是有区别的,定义函数要有函数体,声明函数没有函数体(还有以分号结尾),所以函数定义和声明时都可以将extern省略掉,反正其他文件也是知道这个函数是在其他地方定义的,所以不加extern也行。两者如此不同,所以省略了extern也不会有问题。
static关键字
首先 static 的最主要功能是隐藏,其次因为 static 变量存放在静态存储区,所以它具备持久性和默认值0。
指针和const
指针常量:指针是常量。
int x[] = {1, 2, 3};
int * const p = x;
//p++; // Compile Error
常量指针:常量的指针。
int x = 1;
int const *p = &x;
const int *p = &x;
//*p = 100; // Compile Error
指针和数组
数组指针:
// 数组指针
int y[][2] = {1, 2, 3, 4};
int(*p)[2] = y; // p是数组指针,指向的元素都是长度为2的数组
int a = **p; // 1
int b = (*p)[1]; // 2
int c = (*(p + 1))[1]; // 4
int d = *(*(p + 1) + 1); // 4
指针数组:
// 指针数组
int y[] = {1, 2, 3, 4};
int *ps[] = {y, y + 1, y + 2, y + 3}; //ps是数组,元素都是指针