一、全域性變數
·定義在函式外面的變數是全域性變數
·全域性變數具有全域性的生存期和作用域
·它們與任何函式都無關
·在任何函式內部都可以使用它們
#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 給出的陣列中單個元素的大小,相除得到了陣列的單元個數 一旦修改 中的初始資料,不需要修改遍...