C語言學習之指標高階

2021-07-09 14:00:17 字數 2021 閱讀 7987

函  數

(一)引數:當函式想使用主函式中的變數時,則

將主函式中的變數作為引數傳遞給函

數內部

返回值:當主函式想使用函式中的變數或者

資料時,則將函式內部的資料或變數

作為返回值返回給主函式使用

1.函式的傳參

1.複製傳遞

實參將值複製乙份並給相應的形參

對形參的操作和實參沒有任何關係

2.位址傳遞

如果函式體內部想操作主函式中的

變數,則把主函式的位址傳遞給函

數                                    

3.全域性變數傳遞

4.整型陣列的傳遞

1.int fun(int * a, int len)

傳遞陣列首位址和陣列長度

2.int fun(int a, int len)

傳遞陣列名和陣列長度

maopao_input();

maopao_order();

maopao_output();

5.結構體的傳遞

typedef作用:

給資料型別定義乙個別名

6.字元陣列的傳遞

字元陣列只需傳遞陣列名,不需要傳遞

字元陣列的長度,因為字元陣列中儲存

著用於標識字串結尾的'\0'字元

7.總結

1.實參的型別決定形參的型別

2.函式的功能決定實參傳入的個數

3.函式的返回值型別是由return

後面的資料型別決定的

4.功能決定函式的返回值

zhangsan;m;1000;90

2.函式指標和指標函式

1.函式指標是乙個指標,這個指標指向

乙個函式的位址

char (*fun)(int a, int b);

2.指標函式是乙個函式,這個函式的返

回值是乙個指標

char *fun(int a, int b);

(二)1.主函式的傳參

int main(void);

int main(int argc, char *argv);

1.argc:

傳入引數的個數(1 - n)

2.argv:

1.指標陣列,每個陣列元素儲存傳入主函式

的字串首位址

2.通過argv[0],argv[1] ... argv[n]利用

%s的形式輸出第1個,第2個 ... 第n個字串

2.巨集函式

#define max(a,b) a>b?a:b

巨集函式和函式的區別:

1.巨集函式沒有引數型別的概念,並且只是完成

程式的簡單替換

2.巨集函式是**的簡單替換,所以程式會變長

增加儲存空間

3.巨集函式相比於函式是**替換,執行效率比

較高4.函式是在鏈結時處理的**,函式的執行需

要有引數傳遞,和壓棧出棧的操作

5.函式的使用能夠節省儲存空間,但是因為需

要壓棧和出棧操作所以執行效率不高

記憶體管理

環境變數及系統引數區

堆區棧區

資料區常量區

初始化靜態變數區

未初始化靜態變數區

文字區

資料區:

1.儲存常量

2.儲存靜態變數 static int a

3.儲存全域性變數  

棧區:1.作業系統自動管理的區域(申請,釋放記憶體)

2.棧區通常用來存放區域性變數

3.棧區中的資料未經初始化之前是隨機值

堆區:1.程式設計師手動管理的記憶體區域(申請,釋放)

申請malloc    stdlib.h

釋放free  stdlib.h

2.堆區中的資料一旦使用malloc函式申請,在沒有

經過free函式的釋放之前不能被作業系統**資源

c語言中有2種方式獲得記憶體

1.定義變數 可以通過指標和變數名

2.malloc 只能通過指標來操作

C語言學習之指標詳解

要了解指標,多多少少會出現一些比較複雜的型別,所以我先介紹一下如何完全理解乙個複雜型別,要理解複雜型別其實很簡單,乙個型別裡會出現很多運算子,他們也像普通的表示式一樣,有優先順序,其優先順序和運算優先順序一樣,所以我總結了一下其原則 從變數名處起,根據運算子優先順序結合,一步一步分析.下面讓我們先從...

c語言學習之陣列指標

首先,指標,就相當於乙個位址,指標變數就是拿來存放指標所指向另一變數的位址 定義乙個指標變數需要說明 指標型別,指標變數名。例 int p,a p a 而 陣列,包括陣列型別和陣列名還有陣列長度 陣列長度只能是常量 陣列有一維陣列和多維陣列。例 int a 10 內的必須是常量。那 究竟什麼是陣列指...

C語言學習指標

恢復內容開始 一.運算子 scanf d i 裡的 獲得變數的位址,它的運算元必須是變數 int i printf x i 位址的 大小是否與int相同取決於編譯器 int i printf p i 不能對沒有位址的取位址 a b a a 二.指標初識 就是儲存位址的變數 int i int p i...