理解C語言的聲明
時間:2018-09-28 來源:未知
1. 理解C語言的聲明
聲明主要由聲明器、類型說明符、類型限定符和存儲屬性組成
1.1. 聲明器(declarator)
1) 指針
* const volatile
* volatile
*
* const
* volatile const
指針的五種限定形式
2) 數組
類型 標識符[下標]
3) 函數
類型 標識符(參數列表)
1.2. 類型說明符
1) void char short int long signed unsigned float double
2) 結構體struct
3) 枚舉enum
4) 聯合體union
1.3. 類型限定符
1) const
2) volatile可以放在類型前面,也可以放在后面
1.4. 存儲屬性
1) static
2) extern
3) register
4) auto
5) typedef針對標識符(名稱)
1.5. 聲明的限制
1) 非法
函數的返回值不能為函數
函數的返回值不能為數組
數組中不能有函數
函數的參數不能為函數
2) 合法
函數的返回值可以是函數指針
void (*func(void))(int)
函數的返回值可以是指向數組的指針
int(*func(void))[10]
數組中可以有函數指針
void (*array[10])(int)
函數的參數可以是函數指針
void func(void (*)(int))
1.6. 聲明組成的優先級規則
1) 從名字開始
2) 優先級順序
聲明中被括起來的部分
后綴操作符
括號()表示是一個函數
方括號[ ]表示是一個數組
前綴操作符
星號 * 表示是”指向……的指針“
3) const或volatile關鍵字
如果后面緊跟著類型說明符(如int,long等),則作用于類型說明符
其他情況下,作用于左邊緊鄰的星號 *,表示指針常量(指針不可變)
4) 整體思路
從里往外
從右到左
一找函數
二找數組
三找指針
2. 練習題
詳細解釋說明如下所列的聲明
char *ptr;
char const *ptr;
const char *ptr;
char * const ptr;
char * const *ptr;
int demo1(int);
int *demo2(int);
int (*demo2)(int);
int (*demo3(int))(void);
int (*(*demo4)(int))(void);
int (*(*demo5[10])(int))(void);
int (*(*(*demo6)[10])(int))(void);
int (*(*(*demo7)[10])(void (*cb)(int)))(void);
int (*(*(*const demo8)[10])(void (*cb)(int)))(void);
int * const * (*(*demo9)[10])(void (*cb)(int));
int * const * (*(*demo10)[10])(int (*(*cb)(int))[10]);
習題分步講解:
char *ptr;
ptr //名稱是ptr
* //ptr是一個指向...的指針
char //char類型的數據
/*ptr是一個指向char類型數據的指針。*/
char const *ptr;
ptr //名稱是ptr
* //ptr是一個指向...的指針
char const //char類型的const常量
/*ptr是一個指向char類型const常量數據的指針。*/
const char *ptr;
ptr //名稱是ptr
* //ptr是一個指向...的指針
const char //char類型的const常量
/*ptr是一個指向char類型const常量數據的指針。*/
char * const ptr;
Ptr //名稱是ptr,ptr是一個...
* const //指向...的指針常量
char //char類型數據
/*ptr是一個指向char類型數據的指針常量。*/
char * const *ptr;
ptr //名稱是ptr
* //ptr是指向...的指針
* const //指向...的指針常量
char //char型數據
/*ptr是指向一個指向char型數據的指針常量 的指針。*/
int demo1(int);
demo1 //名稱是demo1
int (int); //demo1是一個函數,參數是int,返回值int
/*demo1是一個帶有一個int型參數,返回值為int類型的函數。*/
int *demo2(int);
demo2 //名稱是demo2
* (int); //demo2是一個函數,參數是int,返回一個指向...的指針int //int類型數據
/*demo2是一個帶有一個int型參數,返回值為一個指向int類型數據的指針。*/
int (*demo2)(int);
demo2 //名稱是demo2,demo2是一個...
* //指向...的指針int ( )(int); //一個函數,參數是int,返回一個int類型數據
/*demo2是一個指向函數的指針,函數有一個int類型參數,返回一個int類型數據。*/
int (*demo3(int))(void);
demo3 //名稱是demo3
* (int) //demo3是一個函數,參數是int,返回一個指向...的指針
int ( )(void); //一個函數,參數是void,返回一個int類型數據
/*demo3是一個帶有一個int型參數,返回值為一個沒有參數的函數,函數返回值為int的函數指針。*/
int (*(*demo4)(int))(void);
demo4 //名稱是demo4
* //demo4是指向...的指針
*( )(int) //一個函數,參數int,返回指向...的指針
int ( )(void); //一個函數,無參數,返回int
/*demo4是指向一個帶有一個int型參數,返回一個無參數返回值為int的函數指針的函數的指針。*/
int (*(*demo5[10])(int))(void);
demo5 //名稱是demo5
[10] //demo5是一個有10個...類型數據元素的數組
* //指向...的指針
*( )(int) //一個函數,參數是int,返回一個指向...的指針
int ( )(void); //一個函數,無參數,返回一個int類型的數據
/*demo5是一個有10個函數指針為元素的指針數組,指針數組元素指向的函數是帶有一個int型參數,返回一個無參數返回值為int的函數指針的函數。*/
int (*(*(*demo6)[10])(int))(void);
demo6 //名稱是demo6
* //demo6是一個指向...的指針
*( )[10] //有10個元素的數組,數組元素類型是指向...的指針
*( )(int) //一個函數,參數是int,返回一個指向...的指針
int ( )(void); //一個函數,無參數,返回一個int類型的數據
int (*(*(*demo7)[10])(void (*cb)(int)))(void);
demo7 //名稱demo7
* //demo7是一個指向...的指針
*( )[10] //有10個元素的數組,數據元素類型是指向...的指針
*( )( . . . . ) //一個函數,參數是...,返回值為一個指向...的指針
*( )( * ) //一個函數,參數是一個指向...的指針,返回值為一個指向...的指針
*( )(void ( )(int)) //一個函數,參數是一個指向一個函數(參數int)的指針,返回值為一個指向...的指針
int ( )(void); //一個函數,無參數,返回值為int類型數據
/*demo7是一個指向有10個函數指針為元素的數組的指針,指針數組元素指向的函數是以一個帶一個int型參數返回為空的函數指針為參數,返回一個無參數返回值為int的函數指針的函數。*/
int (*(*(*const demo8)[10])(void (*cb)(int)))(void);
demo8 //名稱是demo8
*const //demo8是一個指向...的指針常量
*( )[10] //有10個元素的數組,元素數據類型是指向...的指針
*( )( . . . . . ) //一個函數,參數是...,返回值為一個指向...的指針
* //一個指向...的指針
void ( )(int) //一個函數,參數是int,返回void
int ( )(void); //一個函數,參數是void,返回int
/*demo8是一個指向有10個函數指針為元素的數組的指針常量(指針不可變),指針數組元素指向的函數是以一個帶一個int型參數返回為空的函數指針為參數,返回一個無參數返回值為int的函數指針的函數。*/
int * const * (*(*demo9)[10])(void (*cb)(int));
demo9 //名稱是demo9
* //demo9是一個指向...的指針
*( )[10] //有10個元素的數組,元素數據類型是指向...的指針
* ( )( . . . . ) //一個函數,參數是...,返回值為一個指向...的指針
* // 參數是一個指向...的指針
void ( )(int) // 一個函數,參數是int,返回void
* const //指向...的指針常量
int //int類型數據
/*demo9是一個指向有10個函數指針為元素的數組的指針,指針數組元素指向的函數,是以一個帶一個int型參數返回為空的函數指針為參數,返回指向一個int類型數據的指針常量的指針。*/
int * const * (*(*demo10)[10])(int (*(*cb)(int))[10]);
demo10 //demo10
* //demo10是一個指向...的指針
*( )[10] //有10個元素的數組,元素數據類型是指向...的指針
* ( )( . . . . ); //一個函數,參數是...,返回值為一個指向...的指針
( * ); // 參數是一個指向...的指針
( *( )(int) ); // 一個函數,參數是int,返回一個指向...的指針
(int ( )[10]); // 一個有10個元素的數組,數組元素類型是int
* const //指向...的指針常量
int //int類型數據

