C專家程式設計 第三章 分析C語言的宣告

2021-08-16 04:25:41 字數 2645 閱讀 6883

1、關於const的宣告:

const int *p:指標p指向的內容不變;

int const *p:指標p指向的內容不變;

int * const p:指標p不變;

const int * const p:指標和指標指向的內容都不變;

int const * const p:指標和指標指向的內容都不變。

2、一些合法的宣告:

1)int(* fun( ))( ): 函式( fun() )的返回值是乙個指向引數為空,返回值型別為int 的函式指標。

2)int(* foo()): foo( )函式的返回值是乙個指向int型陣列的指標。

3)int(* foo[ ])(): foo陣列裡的元素是指向引數為空返回值為int型的函式指標。

3、關於結構:

1)struct plum, pomegranate, pear;

可以在struct關鍵字後加乙個可選的「結構標籤」;

struct  fruit_tag ;

struct  fruit_tag  plum, pomegranate, pear;

2)跟結構有關的引數傳遞問題:

引數在傳遞時首先盡可能的存放到暫存器中(追求速度)。注意,int型變數 i 跟只包含乙個int型成員的結構變數s 在引數傳遞時的方式可能完全不同。乙個int型引數一般會被傳遞到暫存器中,而結構引數則很可能被傳遞到堆疊中。

在結構體中放置陣列:struct  s_tag;可以把它當作第一等級的型別,用賦值語句拷貝整個陣列,以傳值呼叫的方式把它傳遞到函式,或者把它作為函式的返回型別:

struct  s_tag ;

struct  s_tag  orange, lime, lemon;

struct  s_tag  twofold( struct s_tag  s)

int j;

for(j = 0; j < 100; j++)

s.a[j]  *= 2;

return s;

int main()

int i;

for(i = 0; i < 100; i++)

lime.a[i] = 1;

lemon = twofold(lime);

orange = lemon;    //給整個結構賦值

return 0;

聯合可以節省儲存空間。

5、關於列舉:enum sizes ;

省卻情況下,整型值從零開始,如果對列表中的某個識別符號進行了賦值,那麼緊接其後的那個識別符號的值就比所賦的值大1。列舉有個有點,#define定義的名字一般在編譯時被丟棄,而列舉名字則通常一直在偵錯程式中可見,可以在除錯**時使用他們。

6、char *  const  * (* next)();------- next是乙個指標,它指向乙個函式,該函式返回另乙個指標,該指標指向乙個型別為char的常量指標。

char  *(* c[10])(int **p);----------c[10]是具有10個元素的陣列,裡面的元素型別是函式指標,其所指向的函式的返回值是乙個指向char的指標,該函式的引數是乙個指向指標的指標。

7、void (*signal (int  sig,  void (* func) (int) ) )  (int):

void (*signal (       )) (int);  signal是乙個函式,它的返回值是函式指標該指標所指向的函式接受乙個int型 的引數並返回void。

void (*func) (int) ;   func是乙個函式指標,該指標指向的函式接受乙個int 引數,返回值是void。

用typedef

代替: typedef  void (*ptr_to_func)  (int);

ptr_to_func  signal (int, ptr_to_func);

8、typedef和define的區別:

1)可以用其他型別說明符對巨集型別名進行擴充套件,但對typedef所定義的型別名不能。

#define  peach  int

unsigned  peach  i;--------------------ok

typedef  int banana;

unsigned  banana  i;--------------------error

2)在連續的變數宣告中,typedef定義的型別能夠保證宣告中所有的變數均為同一種型別。

#define  int_ptr  int  *

int_ptr  chalk, cheese;

經過巨集擴充套件:

int * chalk, cheese;--------chalk是指向int型的指標,cheese是int型變數。

typedef  char * char_ptr;

char_ptr  bentley,rolls_royce;

bentley, rolls_royce都表示指向char的指標。

9、結構體的宣告:

typedef  struct  my_tag   my_type

將 struct  my_tag  重新命名為 my_type;定義乙個結構體可用my_type  potato或者struct  my_tag potato。

1)結構體最好不用typedef;

2)最好不省略struct關鍵字;

3)以「_tag」結尾的名字來命名結構標籤。

讀《C專家程式設計》筆記 第三章 分析C語言的宣告

typedef為一種型別引入新的名字,而不是為變數分配空間。在某些方面typedef類似於巨集文本替換 它並沒有引入新型別,而是為現有型別取個新名字,但他們之間存在乙個關鍵性的區別。typedef看上去跟變數宣告完全一樣,普通的宣告表示 這個名字是乙個指定型別的變數 而typedef關鍵字並不建立乙...

C 語言程式設計 第三章

函式呼叫 呼叫函式前要宣告函式原型 型別識別符號 被呼叫函式名 含型別說明的形參表 呼叫形式 函式名 實參列表 函式的遞迴呼叫 函式直接或間接呼叫自身 函式的引數傳遞 1.在函式被呼叫時才分配形參的儲存單元 2.實參可以是常量 變數或表示式 3.實參型別必須與形參相符 如果不相符,編譯器會先進行型別...

C語言第三章

main.c project1 created by sihan guo on 2019 06 13.include int main int argc,const char ar else 迴圈結構 當型 int icount 5 while icount 0 直到型迴圈結構 這個迴圈結構至少執行...