浅记C语言声明 [李园7舍_404]

来源:互联网 发布:万网域名账户间转移 编辑:程序博客网 时间:2024/05/17 03:05

1 声明与定义

声明一个变量意味着向编译器描述变量的类型,但并不为变量分配存储空间,声明简单的说明了在其它地方所定义对象(变量)的名字,它允许你使用这个对象(变量)。定义一个变量意味着在声明变量的同时还要为变量分配存储空间。在C语言中同一变量可以被声明多次,但只能被定义一次。一个最为典型的声明就是用extern。我此刻的感觉:声明表现为   除了函数声明,专用extern来声明之外的声明就是以定义一个数据的形式出现(定义此数据是没有分配相应的内存),如在main函数中写语句int i;而编译器没有给i分配空间,直到i被初始化后才被分配空间,那么定义的形式就是int j = 1;这样的形式了,立即被分配了空间。

 

定义      只能出现在一个地方      确定对象(变量)类型并分配内存,如int a;

声明      可以多次出现                  描述对象(变量)类型,用于指代在其它地方定义的对象(变量),extern int a;如在同一文件中后面位置定义的全局变量或在另一文件中定义的全局变量。

 

2 C语言声明

阅读了《C语言专家编程》之后觉得还是可以记载一下某些知识点的。所有声明的核心是声明器-------标识符以及与它组合在一起的任何指针、函数括号、数组下标等。

大胆的举ge例子说一下何为声明器:

char (*p) [20];

其中(*p)就是一个声明器,由标识符p, 指针*,括号()组成。

那么这整个语句表示什么意思呢?它表示p是一个指向下标大小为20的字符数组的指针。

 

3 C语言声明的组成

至少一个类型说明符【类型说明符(void,int,char等)、存储类型(extern,static,auto,register,typedef)、类型限定符(const, volatile)(如果定义时有类型限定符),这三者并非所有的组合都合法】,有且只有一个声明器,分号。各个声明可以用逗号隔开。

用声明的部件来构成声明不是所有的情况都是符合语法的。


 

4 C语言声明分析

(1)例子

出自《C语言专家编程》

1> char * const *(*next)();

分析:next是一个指向 返回值为指向一个只读的指向字符型的指针 的函数 的指针,或说为:next是一个指向函数的指针,该函数返回另一个指针,该指针指向一个只读的指向char的指针。

 

2> char *(* c[10])(int **p);

分析:c是一个下标为10各元素指向 一个参数为int **类型返回值为char *的函数 的函数指针  的数组,或说为:c是一个数组,各元素是函数指针,此函数参数类型为int **返回值为char *。

 

3>char (*j)[20];

分析:j是一个指向数组的指针,所指数组下标20,此数组元素为char型。

 

(2)分析方法

  • A.声明从它的名字开始读取,然后按照优先级顺序一次读取。
  • B.优先级从高到低依次是:a.声明中被括号括起来的那部分;b.后缀操作符:括号()表示这是一个函数,方括号[]表示这是一个数组;c.前缀操作符:星号*表示“指向....指针”。
  • C.如果const和volatile关键字的后面紧跟类型说明符(int, char等),那么他就作用于类型说明符。在其它情况下,const和volatile关键字作用于它左边紧邻的指针星号。
const修饰对象:

1>const int *grape;

分析:const关键字后面紧跟类型说明符int,所以它作用于类型说明符,表明grape指向的对象是只读的。

 

2>int const *grape;

分析:const后面没有紧跟类型说明符。左边也没有星号,const就作用于左边的0个星号,决定grape指向的对象是只读的。

 

3>int * const grape;

分析:const没有紧邻的类型说明符,作用于左边的星号,表明grape是只读的。

volatile同const。

 

一般说来,星号在定义变量关键字(int,char)左边就是修饰变量内容的,在定义关键字右边就是修饰变量的

 

Note Over。

原创粉丝点击