声明
来源:互联网 发布:软件测试需要培训吗 编辑:程序博客网 时间:2024/04/29 01:27
1. 声明的语法
[声明的格式] 声明说明符 声明符;
声明说明符分为三类:
存储类型:有四种:auto、static、extern和register。
类型限定符:有两种:const和volatile。
类型说明符:关键字void、char、short、int、long、float、double、signed和unsigned。
用typedef创建的类型也是类型说明符。
类型限定符和类型说明符必须跟随在存储类型的后边,但是两者的顺序没有严格的限制。
例如:
存储类型 类型说明符
extern const unsigned long int a[10];
类型限定符 声明符
2. 解释复杂声明
int *(*x[10])(void);
这个声明组合了*、[]和(),所以x是指针、数组还是函数并不明显。
幸好有两条简单规则来理解任何声明:
一是始终从内往外读声明符。换句话说,定为用来声明的标识符,并且从此处的声明开始解释。
二是在做选择时,始终先是[]和()后是*。如果*在标识符的前面,而标识符后被跟着[],那么标识符表示数组而不是指针。同样,如果*在标识符的前面,而标识符后边跟着(),那么标识符表示是函数而不是指针。
例如:
Int *ap[10];
ap是标识符,由于*在标识符的前面,后跟着(),所以ap是指针数组。
例如:
float *fp(float);
fp是标识符,由于*在标识符的前面,后跟着(),所以fp是返回指针的函数。
例如
void (*pf) (int);
1 (1)指针指向
2 (2)具有int型实际参数的函数
3 (3)返回void型值
例如:
int *(* x[10]) (void)
1 (1)数组
2 (2)指针指向
3 (3) 不带实际参数的函数
4 (4) 返回int型的指针
注意:
在C语言中有不能声明的特定内容。函数不能返回数组:
int f(int)[]; /* WRONG*/
函数不能返回函数:
int g(int)(int); /* WRONG*/
函数型的数字也是不可能的:
int a[10] (int); /* WRONG*/
3. const与指针
类型限定符const用来修饰一个常量,有如下两种写法:
1、const在前面
const int value; //value是const
const char*pvalue; //* pvalue是const, pvalue可变
const (char*) pvalue; // pvalue是const,* pvalue可变
char* constpvalue; // pvalue是const,* pvalue可变
const char*const pvalue; // pvalue Content和* pvalue都是const
2、const在后面,与上面的声明对等
int const value; // value是const
char const *pvalue; // * pvalue是const, pvalue可变
(char *)const pvalue; // pvalue是const,* pvalue可变
char* const pvalue; // pvalue是const,* pvalue可变
char const*const pvalue; // pvalue和* pvalue都是const
这里有这么一个规则(因为“()”的出现,使得这个规则有时候是不成立的):沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本 身,即指针本身是常量。
特别注意:对于const (char *) ; 因为char *是一个整体,相当于一个类型(如 char),因此,这是限定指针是const。
4. const与#define
用const的好处如下:
1. const是文档格式。声明对象是const类型就是对象的值不会改变
2. 编译器可以检查到程序不会特意地试图改变对象的值
3. 当为某种可能的应用类型编写程序时(嵌入式),编译器可以用单词const来确定数据存储到ROM中。
const与#define的差异
1. 可以#define指令产生数字常量、字符常量或字符串常量的名字。const可用于产生任何类型的只读对象,包括常量数组、常量指针、常量结构和常量联合。
2. const类型的对象遵循和变量相同的作用域规则,而用#define产生的产量不遵循这规则,
3. 和宏值不同,可以在调试器中看到const型对象的值。