C和指標 總結2

2022-09-11 01:27:14 字數 3598 閱讀 1364

1、char *message = " hello world! ";    等價於    char   *message;    message = " hello world! ";

注:字串是賦給message本身的。

int  a,*b;

b = &a;

2、c語言支援typedef的機制,它允許為各種資料型別定義新名字,typedef宣告的寫法和普通的宣告基本相同,只是把typedef這個關鍵字出現在宣告的前面,如:

typedef         char          *ptr_to_char;    這個宣告把識別符號 ptr_to_char 作為指向字元指標型別的新名字,然後便可以像使用任何預定義名字一樣在下面的宣告中使用這個新名字。例如:

ptr_to_char         a;       宣告 a 是乙個指向字元的指標。

使用 typedef 而不是 #define 來建立新的型別名,因為後者無法正確的處理指標型別,例如:

#define   d_ptr_to_char     char*

d_ptr_to_char    a,b;

正確宣告了 a ,但是 b 卻被宣告為乙個字元,在定義更為複雜的型別名字時,如函式指標或指向陣列的指標,使用 typedef 更為合適。

3、const 關鍵字可以宣告常量,如下宣告:

int   *pi;    pi 是乙個普通的指向整型的指標

int   const   *pci; 指向整型常量的指標,可以修改指標的值,但不能修改它所指向的值。

int   *const   pci;宣告 pci 為乙個指向整型的常量指標,此時指標式常量,它的值無法修改,但可以修改它所指向的整型的值。

int  const  * const  pci;  無論是指標還是它所指向的值都是常量,不允許修改。

4、#define 指令是另一種建立名字常量的機制,例如:

#define  max_elements   50

int     const    max_elements = 50;

在這種情況下,使用 #define 比使用 const 變數更好,只要允許使用字面值常量的地方都可以使用前者,比如宣告陣列的長度,const 變數只能用於允許使用變數的地方,名字常量維護性高,修改容易。

5、作用域:

**塊作用域:位於一對花括號之間的所有語句稱為乙個**塊,任何在**塊的開始位置宣告的識別符號具有**塊作用域,表示它們可以被這個**塊中的所有語句訪問。當**塊處於巢狀狀態時,宣告於內層**塊的識別符號的作用域到達該**塊的尾部便告終止,然而,如果內層**快有乙個識別符號的名字與外層**塊的乙個識別符號同名,內層的那個識別符號就將隱藏外層的識別符號——外層的那個識別符號無法再記憶體**塊中通過名字訪問,宣告9的f和宣告6的f是不同的變數,後者無法在內層**塊中通過名字來訪問。 故應該避免在巢狀的**塊**現相同的變數名。 不是巢狀的**塊則稍有不同,宣告於每個**塊的變數無法被另乙個**塊訪問,因為它們的作用域並無重疊之處。由於兩個**塊的變數不可能同時存在,所以編譯器可以把它們儲存於同乙個記憶體位址,因為任意時刻,兩個非巢狀的**塊最多只有乙個處於活動狀態。

檔案作用域:任何在所有**塊之外宣告的識別符號都具有檔案作用域,它表示這些識別符號從它們的宣告之處直到它所在的原始檔結尾處都是可以訪問的,如1和2.在檔案中定義的函式名也具有檔案作用域,函式名本身並不屬於任何**塊(如:宣告4).

1      int  a;

2      int  b ( int c );

4     int  d ( int e )

6    int   f;

7   int    g( int h );

9     int    f,g,i;

10       int i;

6、鏈結屬性:external、internal、none,沒有鏈結屬性的識別符號總是被當做單獨的個體,也就是說該識別符號的多個宣告被當做獨立不同的實體;屬於internal鏈結屬性的識別符號在同乙個原始檔內的所有宣告中都指同乙個實體,但位於不同原始檔的多個宣告則分屬不同的實體;最後,屬於external鏈結屬性的識別符號不論宣告多少次、位於幾個原始檔都表示同乙個實體。如果某個宣告在正常情況下具有external鏈結屬性,在它面前加上 static 關鍵字可以使它的鏈結屬性變為internal。

static 關鍵字:當用於函式定義時,或用於**塊之外的變數宣告時,static 關鍵字用於修改識別符號的連線屬性,從 external 改為 internal,但識別符號的儲存型別和作用域不受影響,但識別符號的儲存型別和作用域不受影響,用這種方式宣告的函式或變數只能在宣告它們的原始檔中訪問。當它用於**塊內部的變數宣告時,static 關鍵字用於修改變數的儲存型別,從自動變數修改為靜態變數。

static   int     b;         變數b就將為這個原始檔所私有,不會被其他原始檔呼叫。

extern 關鍵字的規則更為複雜,它為乙個識別符號指定external鏈結屬性,這樣就可以訪問在其他位置定義的這個實體。

7、屬於檔案作用域的宣告在預設情況下為external鏈結屬性,所以第一行的a的鏈結屬性為external,static鏈結屬性為internal,變數a,b,c的儲存型別為靜態,表示它們並不是儲存於堆疊中,因此,這些變數在程式執行之前建立,並一直保持它們的值,直到程式結束。當程式開始執行時,變數a將初始化為5。

1     int   a = 5;

2     extern  int   b;

3     static   int  c;

4     int   d( int  e )

5    

17.........

18  

23  .......

24 }

25  static  int  i1;

26  

29   .............

8、當 extern 關鍵字用於原始檔中乙個識別符號的第  1  次宣告時,它指定該識別符號具有 external 鏈結屬性。但是,如果它用於該識別符號的第 2 次或以後的宣告時,它並不會更改又第 1 次宣告所指定的鏈結屬性,如:宣告 4 並不修改由宣告 i 的鏈結屬性。

1       static   int    i;

int       func()

2      int   j;

3     extern   int   k;

4     extern    int    i;

9、總結:具有 external 鏈結屬性的實體在其他語言的術語裡稱為全域性實體,所有原始檔的所有函式均可以訪問它,只要變數並非宣告於**塊或函式定義內部,它在預設情況下的鏈結屬性即為 external 。如果乙個變數宣告於**塊內部,在它前面新增 extern 關鍵字將使它所引用的使全域性變數而非區域性變數。

全域性變數在程式開始執行前建立,並在程式整個執行過程中始終存在。從屬於函式的區域性變數在函式開始執行時建立,在函式執行完畢後銷毀,但用於執行函式的機器指令在程式的生命期內一直存在。

10、當 if  語句巢狀出現時,就會出現「懸空的 else 」問題。例如:

if( i > 1 )

執行結果:

ncbncb

又如:#include

#include

int main()

如果輸入 aaaaaaaa

執行結果:aa

aa18、當需要迴圈體至少執行一次時,選擇 do。

《c和指標》筆記2

列舉型別就是指它的值為符號常量而不是字面值型別.符號名被當作整型常量處理,宣告為列舉型別的變數實際上是整數型別。因此可以將任何整型變數賦值給列舉變數,但是應該避免這種方式使用列舉型別,因為把列舉變數同整數無差別的混合在一起使用,會削弱它們值的含義。浮點家族包括float double和long do...

《C和指標》學習筆記2

在c中,在幾乎所有使用陣列名的表示式中,陣列名的值是乙個指標常量,也就是陣列裡第乙個元素的位址。它的型別取決於陣列元素的型別。只有在兩種情況下,陣列名並不用指標常量來表示,就是當陣列名作為sizeof操作符或者單目操作符 的操作時。sizeof返回整個陣列的長度,而不是指向陣列的指標的長度。取乙個陣...

c 指標和記憶體結構總結

指標的操作 加法 減法 sizeof 解引用 指向操作符 int arr 3 int p1 arr 和int p1 arr 0 一致 int p2 p1 1 和int p2 arr 1 一致 int p3 p2 1 和int p1 arr 一致解引用操作 int a 10 int p a p記憶體塊...