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* const
pvalue;
// 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
型对象的值。