c 回憶1 《C 大學教程》

2021-04-02 19:50:11 字數 3636 閱讀 9138

1、儲存類

4個儲存類說明符:auto、register、extern、static。識別符號的儲存類說明符可以確定其儲存類、範圍和連線。

分兩類:

自動儲存類——auto和register。

只有變數能作為自動儲存類,函式的區域性變數和引數通常都是自動儲存類。區域性變數預設為自動儲存類。

靜態儲存類——extern和static。

這兩個關鍵字用來宣告靜態儲存類變數和函式的識別符號。這種變數從程式開始執行時就存在。對於變數,程式開始執行時就分配和初始化儲存空間;對於函式,從程式開始執行時就存在函式名。

全域性變數和函式名預設為extern。用static宣告的區域性變數仍然只在定義該變數的函式中使用,但與自動儲存類變數不同的是,static區域性變數在函式退出時保持其數值。下次呼叫這個函式時,static區域性變數包含上次函式退出時的值。注:所有靜態儲存類的數字變數都預設初始化為0。

全域性變數能夠被同乙個檔案中該變數宣告後的所有函式訪問。其他檔案中的函式也可以訪問全域性變數,但必須在使用前予以宣告,如在乙個檔案中定義:

int flag;

則在另乙個檔案中需定義如下:

extern int flag;

才可使用全域性變數flag。

說明:儲存類別說明符extern告訴編譯器:變數flag或者稍後定義在同乙個檔案中,或者在另乙個檔案中定義。而編譯器不知道flag定義在何處,因此讓連線程式查詢flag,如果沒有找到flag的定義,則發出錯誤訊息,如找到,則指明其位置,從而解決對該變數的引用。對於函式的引用也是如此。可以用static關鍵字來防止定義在其他檔案中的函式(沒有在同乙個檔案中定義)使用這些全域性變數或函式。

2、enum的宣告

enum status(continue,won,lost);

status gamestatus;

預設列舉常量(continue,won,lost)從0開始,增量為1。

enum months(jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec);

也可指定從某個常數開始,如上例從1開始,增量為1。

3、預設引數

必須是函式引數表中最右邊的引數。

int fun1(int,int=1,int=2); //正確

int fun2(int=1,int); //錯誤

預設引數應在函式名第一次出現是指定,通常在函式原型中。

4、一元作用域運算子 :: 可以在同名區域性變數的作用域中訪問全域性變數。

5、函式過載

通過函式簽名(函式名和引數型別的組合,包括引數個數,型別,順序)來區別。編譯器用引數個數和型別為每個過載函式編碼(名字改編或名字修飾)。

6、陣列

如果初始化的元素比陣列中的元素少,則其餘元素自動初始化為0。所以至少需要初始化第乙個元素,才能將其餘元素自動初始化為0。但是,如果宣告為static陣列,則在沒有顯式初始化時,便以其將自動初始化為0。

陣列維數只能用常量宣告,無論是靜態陣列還是自動陣列。

字元陣列可以用字串直接量(注:字串直接量返回指向第乙個字元的指標)初始化。

char string1[ ]= " first " ;

字串 " first " 包含五個字元加乙個特殊字串終止符 ' /0 ' 。故string1的長度為6。

將陣列傳遞給函式:

原型:void modifyarray(int[ ] , int ); 或

void modigyarray(int anyarrayname[ ], int anyvariablename);

c++編譯器將忽略原型中的變數名,上述兩種原型宣告等價。

7、指標

int a;

int *aptr = &a ;

則&*aptr和*&aptr將返回相同的值,即為aptr的值,可知&和*運算子是互逆的。

宣告為const的指標應在宣告時初始化(如果是函式引數,則用傳入函式的指標初始化)。

結構(類)總是按值呼叫,傳遞整個結構(類)的副本。

陣列總是按引用呼叫,陣列名就是陣列第乙個元素的位址。

sizeof運算子作用於陣列名時,返回陣列總共占用的位元組數。

double realarray[22];

sizeof realarray /sizeof(double); //返回22

char* suit[4]=;

suit中的陣列元素存放每個字串的首字母的位址,因此suit是定長的。

所以sizeof suit將返回16(如果單個位址占用4位元組)。

8、函式指標

函式指標包含函式在記憶體中的位址。

將函式指標傳給函式:

原型:void bubble( int[ ], const int, int ( * ) ( int, int ) );

上述第三個引數即為函式指標型別。

看函式定義:

void bubble( int work[ ], const int size, int ( * compare ) ( int, int ) )

推薦使用第一種形式,因它顯示說明compare為函式指標,第二種形式容易認為compare是個實際函式。

函式指標陣列宣告如下:

void ( * f[ 3 ] )( int )=;

上式宣告具3個函式指標的陣列f。

函式呼叫如下:

(* f[0])(a);  //a為int型引數

9、建構函式與析構函式

一般情況下,析構函式的呼叫順序與建構函式相反。

全域性範圍中定義的物件的建構函式在檔案中的任何其他函式(包括main)執行之前呼叫(但不同檔案之間全域性物件建構函式的執行順序是不確定的)。當main終止或者呼叫exit函式時呼叫相應的析構函式。

當程式執行到物件定義時,呼叫自動區域性物件的建構函式。該物件的析構函式在物件離開範圍時呼叫(即離開定義物件的塊時)。自動物件的建構函式和析構函式在每次物件進入和離開範圍時呼叫。

static區域性物件的建構函式旨在程式執行首次到達物件定義時呼叫一次,對應的析構函式在main終止或呼叫exit函式時呼叫。

可見構造函式呼叫順序:

全域性物件-〉區域性自動(或靜態)物件(按執行順序)。

析構函式呼叫順序:

區域性自動物件-〉main( )執行結束後,靜態物件(區域性或全域性)-〉全域性物件。

10、關於成員函式返回引用

不要讓類的public成員函式返回對該類private資料成員的非const引用(或指標),返回這種引用會破壞封裝。

如:#include

using namespace std;

class time;

int time::gethour()

int &time::badsethour(int hh)

int main()

{time t;

int &hourref=t.badsethour(20);

cout<

hourref=8;

cout<

輸出為:20

8

5

1 C基礎介紹

1.程式執行 解釋 借助乙個程式,那個程式能試圖理解你的程式,然後按照你的要求執行。編譯 借助乙個程式,就像乙個翻譯,把你的程式翻譯成計算機真正能懂的語言 機器語言 寫的程式,然後,這個機器語言寫的程式就能直接執行了。注意,語言本身沒有解釋和編譯之分,只是執行的方式不同而已。2.c語言在 作業系統 ...

1 C 程式設計基礎

1 c表示c程式檔案的字尾名,cpp表示c 程式檔案的字尾名 編寫的c 程式的字尾名既可以用.c也可以用.cpp 2 在linux環境下,c程式和c 程式都可以用gcc和g 來編譯,區別是gcc編譯器會根據檔案字尾名對函式或變數名做某些修正,乙個是c的編譯方式,乙個是c 的編譯方式。而g 無論是對....

分治 1 C 描述

花了一下午的時間去搞懂演算法筆記上面的那個全排列的問題,看來放鬆時間久了 能力的確會下降的很快 遞迴的概念很簡單,就是乙個函式自己呼叫自己,然後等到呼叫到不可再呼叫時依次從後往前返回值 函式遞迴有兩個特點 遞迴邊界 一般來指函式呼叫到最底層的結果 遞迴式 即遞迴呼叫 如果乙個函式沒有遞迴邊界,會因為...