中國大學MOOC 浙大C語言高階學習筆記03

2021-10-09 12:37:35 字數 2624 閱讀 5082

一、全域性變數

·定義在函式外面的變數是全域性變數

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

·它們與任何函式都無關

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

#include

int f(void);

int gall=12;

int main(int argc,char const *ar**)

int f(void)

1、全域性變數初始化

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

·指標會得到null值

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

eg: 

int gall=12;

int g2=gall;//這個方式是錯誤的 不能進行這個操作

除非:const gall=12;

int g2=gall;

但是不建議這麼使用

·它們的初始化發生在main函式之前

被隱藏的全域性變數!

·如果函式內部存在與全域性變數同名的變數,則全域性變數被隱藏

在小範圍內,全域性變數被隱藏了!

更小的地方會把大範圍內的變數隱藏掉!

二、靜態的本地變數

·在本地變數定義時加上static修飾符就成為靜態本地變數

·當函式離開的時,靜態本地變數會繼續存在並保持其值

·靜態本地變數的初始化只會在第一次進入這個函式時做,以後進入函式時會保持上次離開時的值

·靜態本地變數實際上是特殊的全域性變數

eg:定義乙個全域性變數,和乙個靜態本地變數,取兩者的位址進行對比

再對比 兩個普通變數

·它們位於相同的記憶體區域

·靜態本地變數具有全域性的生存期,函式內的區域性作用域

·static在這裡的意思是區域性作用域(本地可訪問)

#include

int f(void);

int gall=12;

int main(int argc,char const *argc)

int f(void)

3、*返回指標的函式

·返回本地變數的位址是危險的 會被繼續分配給其他變數

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

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

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

tips:

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

·盡量避免使用全域性變數

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

三、編譯預處理和巨集

1、巨集定義

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

#define 用來定義乙個巨集

巨集:#define pi 3.14159

其中pi是巨集的名字 3.14159是巨集的值

.c->.i->.s->.o->a.out

.i:經過編譯預處理執行完之後產生的檔案

.s:編譯器對.i檔案進行編譯得到彙編**檔案

.o:目標**檔案,對.s進行彙編後的結果

a.out:對.o進行鏈結形成乙個最後檔案

2、巨集定義的使用

#include 《stdio.h>

#define pi 3.14159

#define format "%f\n"

#define pi2 2*pi //pi*2 

·巨集裡面含有的其他巨集名會被替換為該巨集的值

·巨集可以被注釋

#define prt printf("%f",pi);\

printf("%f\n",pi2)

·巨集可以換行

3、沒有值的巨集

#define ——debug

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

4、預定義的巨集

__line__ //行號

__file__ //檔名

__date__ //編譯時的日期和時間

__time__

__stdc__

5、帶引數的巨集

類似函式的巨集

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

巨集可以帶引數

將來x會被替換 eg:cube(5)相當於 5*5*5

定義錯誤的巨集

#define radtodeg1(x)(x*57.29578)

#define radtodeg2(x)(x)*57.29578

#include

#define radtodeg1(x)(x*57.29578)

#define radtodeg2(x)(x)*57.29578

int main(int argc,char const *ar**)

--帶引數的巨集的原則

·一切都要括號

·整個值要括號

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

·#define radtodeg(x) ((x)*57.2958)

此外:可以帶多個引數,#define min(a,b)((a)>(b)?(b):(a))

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

巨集定義不能加分號,否則展開之後會多乙個分號

inline函式

其他編譯預處理指令:條件編譯 error等等

中國大學MOOC 浙大C語言高階學習筆記01

第三週 結構型別 1 列舉 定義可以羅列起來的名字 enum color 列舉是一種使用者定義的資料型別,用關鍵字enum以如下語法來宣告 enum列舉型別名字 列舉型別名字通常並不真的使用,要用的是在大括號裡的名字,因為他們就是常量符號,型別是int,值依次從0到n 當需要一些可以排列起來的常量值...

中國大學MOOC 浙大C語言高階學習筆記05

第六周 互動圖形設計 略 1 圖形程式的終端輸入 函式指標和互動圖形介面程式所體現出來的設計模式 mvc設計模式 圖形的終端輸入輸出 acllib庫 第七周 1 檔案 格式化的輸入輸出 printf flags width prec hll type scanf flag type flag 含義 ...

中國大學MOOC 浙大C語言學習筆記05

7.1 陣列運算 陣列的整合初始化 陣列初始化02 int num0 10 陣列的大小 sizeof給出的整個陣列所佔據的內容的大小,單位是位元組 sizeof a sizeof a 0 sizeof a 0 給出的陣列中單個元素的大小,相除得到了陣列的單元個數 一旦修改 中的初始資料,不需要修改遍...