回覆列表
  • 1 # 兔兔我經歷了啦啦啦

    函式呼叫 1)注意在函式呼叫時實參和形參的個數、型別應一一對應。對實參表求值的順序是不確定的,有的系統按自左至右,有的系統則按自右至左的順序。這一點要注意。 2)函式呼叫的方式:函式語句,函式表示式,函式引數 3)如果主調函式和被調函式在同一檔案中,並且主調函式在前,那麼一般要在主調函式中對被調函式進行說明。除非:(1)被調函式的返回值型別為整型或字元型(2)被調函數出現在主調函式之前。 4)對函式的說明和定義是不同的,定義是指對函式功能的確立,包括指定函式名,函式值型別,形參及其型別、函式體等。說明則只是對已定義的函式返回值型別進行說明,只包括函式名、函式型別以及一個空的括弧,不包括形參和函式體。 5)c語言允許函式的遞迴呼叫(在呼叫一個函式的過程中又出現直接或間接的呼叫該函式本身)。 變數的指標和指向變數的指標變數 讀起來很拗口,說白了就是變數的地址和用來存放變數地址的地址變數。因為一個變數在編譯的時候系統要為它分配一個地址,假如再用一個變數來存放這個地址,那麼這個變數就叫做指向變數的指標變數,也就是用來存放變數地址的這麼一個變數。所謂"指向"就是指存放××的地址,如指向變數的指標變數,"指向"就是指用來存放變數的地址,再如指向陣列的指標變數,"指向"就是指存放陣列的地址。只要理解了這個,指標也就不難了。另外,還有指向字串的指標變數,指向函式的指標變數,指向指標的指標變數等。 1) 指標變數的定義 形式:型別識別符號 *識別符號 如:int *pointer; 要注意兩點:*表示pointer是個指標變數,在用這個變數的時候不能寫成*pointer, *pointer是pointer指向的變數。一個指標變數只能指向同一個型別的變數。如上面 pointer只能指向int型變數。 2)指標變數的引用 兩個有關的運算子: & 取地址運算子 &a 就代表變數a的地址 * 指標運算子 *a 就代表變數a的值 2. 陣列的指標和指向陣列的指標變數 陣列的指標指陣列的起始地址,陣列元素的指標指陣列元素的地址。 1)指向陣列元素的指標變數的定義與賦值 定義和指向變數的指標變數定義相同,c規定陣列名代表陣列的首地址,即第一個陣列元素地址。 2)透過指標引用陣列元素 我們通常引用陣列元素的形式是a[i],如果用指標可以這樣引用,*(a+i),或定義一個指標變數p,將陣列a的首地址賦給p,p=a;然後用*(p+i)引用。 注意:指標變數p指向陣列a首地址,則p++指向陣列a的下一元素地址,即a[1]的地址。 3)陣列名作函式引數 形引數組和實引數組之間並不是值傳遞,而是共用同一段地址,所以在函式呼叫過程中如果形參的值發生變化,則實參的值也跟著變化。 4)指向多維陣列的指標和指標變數 以二維陣列為居多。假設定義了一個二維陣列a[3][4],那麼 a代表整個二維陣列的首地址,也代表第0行的首地址,同時也是第0行第0列的元素的首地址。a +0和a[0]代表第0行首地址,a+1和a[1]代表第一行的首地址。 假設a是一個數組的首地址,那麼如果a是一維的,a+I代表第I個元素的地址,如果a是二維的,則a+I代表第I行的首地址。 那麼第一行第二列的元素地址如何表示呢?a[1]+2或&a[1][2]或*(a+1)+2。 我們只要記住:在二維陣列中a代表整個陣列的首地址,a[I]代表第I行的首地址,a[I]與*(a+I)等價就行了。只要運用熟練了就沒什麼複雜的了。 5)指向由m個整陣列成的一維陣列的指標變數 如:int (*p)[4],p是一個指向包含4個元素的一維陣列,如果p先指向a[0],則p+1指向a[1],即p的增值是以一維陣列的長度為單位的,這裡是4,舉個例子: 假設a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},p先指向a[0]也就是陣列a的首地址,那麼p+1就是a[1]的首地址即元素9的地址,因為在定義p時int (*p)[4],定義一維陣列長度為4,所以p+1就等於加了一個一維陣列的長度4。 3. 字串的指標和指向字串的指標變數 1)字串的表示形式 c中字串有兩種表示形式:一種是陣列,一種是字元指標 char string[]="I love c!"; char *str="I love c!"; 其實指標形式也是在記憶體中開闢了一個數組,只不過陣列的首地址存放在字元指標變數str中,千萬不要認為str是一個字串變數。 2)字串指標作函式引數 實際上字串指標就是陣列的首地址。 3)字元指標變數與字元陣列的區別 ① 字元陣列由若干元素組成,每個元素存放一個字元,而字元指標變數只存放字串的首地址,不是整個字串 ② 對陣列初始化要用static,對指標變數不用。 ③ 對字元陣列賦值,只能對各個元素賦值,不能象下面這樣: char str[14]; str="I love c!"; 對指標變數可以, char *str; str="I love c!"; 注意:此時賦給str的不是字元,而是字串首地址。 ④ 陣列在定義和編譯時分配記憶體單元,而指標變數定義後最好將其初始化,否則指標變數的值會指向一個不確定的記憶體段,將會破壞程式。如: char *a; scanf( "%s", a );這種方法是很危險的,應該這樣: char *a, str[10]; a = str; scanf( "%s", a );這樣字元指標就指向了一個確定的記憶體段。 ⑤ 指標變數的值是可以改變的,而字元陣列名所代表的字串首地址卻是不能改變的。 4. 函式的指標和指向函式的指標變數 一個函式在編譯時被分配一個入口地址,這個入口地址就稱為函式的指標。函式名代表函式的入口地址,這一點和陣列一樣。我們可以用一個指標變數來存放這個入口地址,然後透過該指標變數呼叫函式。如:假設有一個求兩者較大的函式如下:int max( int x, int y ); 當我們呼叫這個函式時可以這樣: int c; c=max( a, b );這是通常呼叫方法,其實我們可以定義一個函式指標,透過指標來呼叫,如: int (*p)(); //注意指向函式指標變數的定義形式 p=max; //此句就是將函式的入口地址賦給函式指標變數p c=(*p)( a, b ); 有些朋友可能對(*p)()不大理解,其實它的意思就是定義一個指向函式的指標變數p,p不是固定指向哪個函式的,而是專門用來存放函式入口地址的變數。在程式中把哪個函式的入口地址賦給它,它就指向哪個函式。但要注意,p不能象指向變數的指標變數一樣進行p++,p-等無意義的操作。 既然p是一個指標變數,那麼就可以作為函式的引數進行傳遞。其實函式的指標變數最常用的用途之一就是作為函式引數傳遞到其它函式。這也是c語言中應用的比較深入的部分了。 變數的指標和指向變數的指標變數 讀起來很拗口,說白了就是變數的地址和用來存放變數地址的地址變數。因為一個變數在編譯的時候系統要為它分配一個地址,假如再用一個變數來存放這個地址,那麼這個變數就叫做指向變數的指標變數,也就是用來存放變數地址的這麼一個變數。所謂"指向"就是指存放××的地址,如指向變數的指標變數,"指向"就是指用來存放變數的地址,再如指向陣列的指標變數,"指向"就是指存放陣列的地址。只要理解了這個,指標也就不難了。另外,還有指向字串的指標變數,指向函式的指標變數,指向指標的指標變數等。 1) 指標變數的定義 形式:型別識別符號 *識別符號 如:int *pointer; 要注意兩點:*表示pointer是個指標變數,在用這個變數的時候不能寫成*pointer, *pointer是pointer指向的變數。一個指標變數只能指向同一個型別的變數。如上面 pointer只能指向int型變數。 2)指標變數的引用 兩個有關的運算子: & 取地址運算子 &a 就代表變數a的地址 * 指標運算子 *a 就代表變數a的值 2. 陣列的指標和指向陣列的指標變數 陣列的指標指陣列的起始地址,陣列元素的指標指陣列元素的地址。 1)指向陣列元素的指標變數的定義與賦值 定義和指向變數的指標變數定義相同,c規定陣列名代表陣列的首地址,即第一個陣列元素地址。 2)透過指標引用陣列元素 我們通常引用陣列元素的形式是a[i],如果用指標可以這樣引用,*(a+i),或定義一個指標變數p,將陣列a的首地址賦給p,p=a;然後用*(p+i)引用。 注意:指標變數p指向陣列a首地址,則p++指向陣列a的下一元素地址,即a[1]的地址。 3)陣列名作函式引數 形引數組和實引數組之間並不是值傳遞,而是共用同一段地址,所以在函式呼叫過程中如果形參的值發生變化,則實參的值也跟著變化。 4)指向多維陣列的指標和指標變數 以二維陣列為居多。假設定義了一個二維陣列a[3][4],那麼 a代表整個二維陣列的首地址,也代表第0行的首地址,同時也是第0行第0列的元素的首地址。a +0和a[0]代表第0行首地址,a+1和a[1]代表第一行的首地址。 假設a是一個數組的首地址,那麼如果a是一維的,a+I代表第I個元素的地址,如果a是二維的,則a+I代表第I行的首地址。 那麼第一行第二列的元素地址如何表示呢?a[1]+2或&a[1][2]或*(a+1)+2。 我們只要記住:在二維陣列中a代表整個陣列的首地址,a[I]代表第I行的首地址,a[I]與*(a+I)等價就行了。只要運用熟練了就沒什麼複雜的了。 5)指向由m個整陣列成的一維陣列的指標變數 如:int (*p)[4],p是一個指向包含4個元素的一維陣列,如果p先指向a[0],則p+1指向a[1],即p的增值是以一維陣列的長度為單位的,這裡是4,舉個例子: 假設a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},p先指向a[0]也就是陣列a的首地址,那麼p+1就是a[1]的首地址即元素9的地址,因為在定義p時int (*p)[4],定義一維陣列長度為4,所以p+1就等於加了一個一維陣列的長度4。 3. 字串的指標和指向字串的指標變數 1)字串的表示形式 c中字串有兩種表示形式:一種是陣列,一種是字元指標 char string[]="I love c!"; char *str="I love c!"; 其實指標形式也是在記憶體中開闢了一個數組,只不過陣列的首地址存放在字元指標變數str中,千萬不要認為str是一個字串變數。 2)字串指標作函式引數 實際上字串指標就是陣列的首地址。 3)字元指標變數與字元陣列的區別 ① 字元陣列由若干元素組成,每個元素存放一個字元,而字元指標變數只存放字串的首地址,不是整個字串 ② 對陣列初始化要用static,對指標變數不用。 ③ 對字元陣列賦值,只能對各個元素賦值,不能象下面這樣: char str[14]; str="I love c!"; 對指標變數可以, char *str; str="I love c!"; 注意:此時賦給str的不是字元,而是字串首地址。 ④ 陣列在定義和編譯時分配記憶體單元,而指標變數定義後最好將其初始化,否則指標變數的值會指向一個不確定的記憶體段,將會破壞程式。如: char *a; scanf( "%s", a );這種方法是很危險的,應該這樣: char *a, str[10]; a = str; scanf( "%s", a );這樣字元指標就指向了一個確定的記憶體段。 ⑤ 指標變數的值是可以改變的,而字元陣列名所代表的字串首地址卻是不能改變的。 4. 函式的指標和指向函式的指標變數 一個函式在編譯時被分配一個入口地址,這個入口地址就稱為函式的指標。函式名代表函式的入口地址,這一點和陣列一樣。我們可以用一個指標變數來存放這個入口地址,然後透過該指標變數呼叫函式。如:假設有一個求兩者較大的函式如下:int max( int x, int y ); 當我們呼叫這個函式時可以這樣: int c; c=max( a, b );這是通常呼叫方法,其實我們可以定義一個函式指標,透過指標來呼叫,如: int (*p)(); //注意指向函式指標變數的定義形式 p=max; //此句就是將函式的入口地址賦給函式指標變數p c=(*p)( a, b ); 有些朋友可能對(*p)()不大理解,其實它的意思就是定義一個指向函式的指標變數p,p不是固定指向哪個函式的,而是專門用來存放函式入口地址的變數。在程式中把哪個函式的入口地址賦給它,它就指向哪個函式。但要注意,p不能象指向變數的指標變數一樣進行p++,p-等無意義的操作。 既然p是一個指標變數,那麼就可以作為函式的引數進行傳遞。其實函式的指標變數最常用的用途之一就是作為函式引數傳遞到其它函式。這也是c語言中應用的比較深入的部分了。

  • 中秋節和大豐收的關聯?
  • 想念父親的詩句?