C語言學習筆記之程式結構

2021-10-12 05:50:12 字數 3117 閱讀 2673

1.定義在函式外部的變數就叫全域性變數

2.全域性變數具有全域性的生存期和作用域

3.它們與任何函式都無關

4.在任何函式內部都可以使用它們

全域性變數初始化

1.沒有做初始化的全域性變數會得到0值

2.指標會得到null值

3.只能用編譯時刻已知的值來初始化全域性變數

不能實現:

int a=10;

int b=a;

intmain()

結果:

&a=

0000000000403010

&b=0000000000403014

&k=000000000062fe1c

*返回指標的函式

1.返回本地變數的位址是危險的

2.返回全域性變數或靜態本地變數的位址是安全的

3.返回在函式內malloc的記憶體是安全的,但是很容易造成問題,

4.最好的做法是返回傳入的指標

#include

int*f(

void);

voidg(

void);

intmain()

int*f(

void

)voidg(

void

)

結果:

&a=

6487516

*p=1b=2

&b=6487516

*p=2

因為在函式結束後本地變數會消亡!!

tips

1.不要使用全域性變數在函式間傳遞引數和結果

2.盡量避免使用全域性變數

3.使用全域性變數和靜態本地變數的函式是執行緒不安全的

編譯預處理指令

1.#開頭的是編譯預處理指令

2.它們不是c語言的成分,但是c語言程式離不開它們

3.#define用來定義乙個巨集

沒有值的巨集

1.#define_debug

2.這類巨集是用於條件編譯的,後面有其他的編譯預處理指令來檢查這個巨集是否已經被定義過了

預定義的巨集

_line_//行號

_file_//檔名

_date_//定義的日期

_time_//定義的時間

_stdc_

類似於函式

#include

#define cube(x) ((x)*(x)*(x))

intmain()

1巨集可以帶引數

2.可以帶多個引數

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

3.也可以組合(巢狀)使用其他巨集

錯誤定義的巨集

#include

#define radtodeg1(x) (x*57.29578)

#define radtodeg2(x) (x)*57.29578

intmain()

結果:

119.591560

10313.240400

帶引數的巨集的原則

1.一切都要括號

a.整個值要括號

b.引數出現的每個地方都要括號

2.#define radtodeg(x) ((x)*57.29578)

3.巨集定義的最後不要加分號!

總結:1.在大型程式的**中使用非常普遍

2.可以非常複雜,如「產生」函式

在#和##兩個運算子幫助下

3.存在中西方文化差異

4.部分巨集會被inline函式代替

其他編譯預處理指令

1.條件編譯

2.error

3.。。。

思路:專案

1.在dev c++中新建乙個專案,然後把幾個源**檔案加入進去

2.對於專案,dev c++的編譯會把乙個專案中的所有的源**檔案都編譯後,鏈結起來

3.有的ide(vs)有分開的編譯和構建兩個按鈕,前者是對單個源**檔案編譯,後者是對整個專案做鏈結

把函式原型放到乙個標頭檔案(以.h結尾)中,在需要呼叫這個函式的源**檔案(.c檔案)中#include這個標頭檔案,就能讓編譯器在編譯的時候知道函式的原型

include

1.#include是乙個編譯預處理指令,和巨集一樣,在編譯前就處理了

2.它把那個檔案的全部文字內容原封不動地插入到它所在的地方

3.所以也不是一定要在.c檔案的最前面#include

選擇「」還是<>

1.#include有兩種形式來指出要插入的檔案

「」要求編譯器首先在當前目錄(.c檔案所在的目錄)尋找這個檔案,如果沒 有,到編譯器指定的目錄去找

<>讓編譯器只在指定的目錄去找

2.編譯器自己知道自己的標準庫的標頭檔案在哪

3.環境變數和編譯器命令列引數也可以指定尋找標頭檔案的目錄

include的誤區

1.#include不是用來引入庫的

2.stdio.h裡只有printf的原型,printf的**在另外的地方,某個.lib(windows)或.a(unix)中

3.現狀的c語言編譯器缺省會引入所有的標準庫

4.#include只是為了讓編譯器知道printf函式的原型,保證你呼叫時間給出的引數值是正確的型別

不對外公開的函式

1.在函式前面加上static就使它成為只能在所在的編譯單元中被使用的函式

2.在全域性變數前面加上static就使得它成為只能在所在的編譯單元中被使用的全域性變數

標準標頭檔案結構:

#ifndef __list_head__

#define __list_head__

#include

"node.h"

typedef

struct _list list;

#endif

1.運用條件編譯和巨集,保證這個標頭檔案在乙個編譯單元中只會被#include一次

2.pragma once也能起到相同的作用,但不是所有的編譯器都支援

C語言學習筆記 C程式結構

在我們學習 c 語言的基本構建塊之前,讓我們先來看看乙個最小的 c 程式結構,在接下來的章節中可以以此作為參考。c 程式主要包括以下部分 include int main 接下來我們講解一下上面這段程式 程式的第一行 include是預處理器指令,告訴 c 編譯器在實際編譯之前要包含stdio.h檔...

黑馬程式設計師 C語言學習筆記之基本程式結構

ios培訓 android培訓 期待與您交流!1.條件語句 像其它語言一樣 c也提供條件語句。在c中條件語句的一 般形式為 if 表示式 語句1 else 語句2 上述結構表示 如果表示式的值為非0 ture 即真,則執行語句1,執行完語 句1從語句2後開始繼續向下執行 如果表示式的值為0 fals...

《C程式語言》學習筆記(04)函式與程式結構

把程式中不需要了解的具體操作細節隱藏起來,從而使整個程式結構更加清晰,並且降低修改程式的難度。封裝 找到所有與模式匹配的行 getline,strindex include include define maxline 1000 intgetline char line,int max int st...