預處理指令:
所有的預處理指令都是以#開頭
**翻譯成0和1之前執行的指令
1、巨集定義
2、條件編譯
3、檔案包含
預處理指令的位置是隨便寫的,但是預處理指令是有作用域的
一、巨集定義
格式:#define count 6
#undef count 作用失效,作用域結束
巨集定義一般是大寫,或者以k開頭
2、帶引數的巨集
#define sum(v1,v2) v1+v2
int a =10;
int b = 20;
int c = sum(a,b);
printf("%d",c);//輸出30
巨集定義只負責替換** 不負責進行算術計算
注意:大引數的巨集定義,一定要加()否則可能導致計算錯誤
#define pingfang(a) ((a)*(a))
帶引數的巨集定義效率比函式高
二、條件編譯:
只有符合條件的語句才參與編譯
有#if必須有#endif
#if defined(a) //#if def a
printf("");
#endif
檔案關聯(include):
<>表示系統自帶的,「」表示自定義的檔案
不允許迴圈包含,比如a.h包含b.h,b.h又包含a.h
當程式較大,存在多個檔案時
例如:乙個主函式檔案 main.c
乙個算術函式檔案 jisuan.c
編譯執行的時候要將兩個一起編譯執行,但main.c檔案中有沒
有對jisuan.c中函式的宣告,因此需要,jisuan.c檔案的編寫
者編寫乙份.h檔案,將所用到的函式的宣告寫到.h檔案中區,
並在主函式中新增 #include 「***.h」;將這個檔案包含進來
.h檔案的寫法
內容:是非中函式的宣告語句
注意:為了保證.h檔案能夠準確執行在書寫時應新增判斷
例如:#ifndef xx_h//此處的命名規則要謹記
#define xx_h
...函式的宣告
#endif
typedef:
基礎型別改名:
typedef int myint ;給int起乙個別名 程式中可以代替int
myint a=20;
字元指標變字串string
typedef char * string; 給指標型別char*起乙個別名string
string name ="jack";
結構體:
typedef struct student mystu;
mystu stu;
或者typedef struct student //定義型別 改變名稱
mystu;
或者typedef struct //未定義型別 只是給定義的結構體改一
個名字mystu;
定義乙個指向函式的指標
typedef int (*mypoint)(int,int);
mypoint p = sum;//這樣宣告跟定義
typedef作用:
1、給已經存在的型別起乙個新的名稱
2、適用場合:
①基本資料型別
②指標③結構體
④列舉⑤指向函式的指標
注意:#define string2 char*
string2 s1,s2;
#define 只是簡單的替換,上面的語句相當於
char *s1,s2; 相當於
char *s1; char s2;
但是:typedef char* string
string s1,s2;
typedef是給已存在型別起乙個新的名稱,相當於
char*(s1,s2); 相當於
char *s1; char *s2;
static和extern
1、函式
下所有函式都是外部函式
extern void test()extern 可以省略,因為預設均為外部
不允許有同名外部函式、
static void test2()
允許不同檔案中有同名的內部函式
static對函式的作用:
1、定義乙個內部函式
2、宣告乙個內部函式
extern 對函式的作用:
1、完整的定義乙個外部函式
2、完整的宣告乙個外部函式
extern可以省略,預設情況下宣告和定義的函式都是外部函式
2、變數
全域性變數:
1、外部變數:
定義的變數能被本檔案和其他檔案訪問
①預設情況下,所有的全域性變數都是外部變數(不同檔案中的
同名全域性變數實際上是乙個變數,佔據同乙個的記憶體空間)
(extern)int a ;即定義外部變數
2、內部變數:
定義的變數只能被本檔案訪問,不能被其他檔案訪問
static int b;
不同檔案中的同名內部變數,互不影響
static 對變數的作用:
①定義乙個內部變數
extern對變數的作用
①定義乙個外部變數
static對函式的作用
①定義和宣告乙個內部函式
extern對函式的作用:
定義和宣告乙個外部函式(可以省略)
static修飾區域性變數:
①延長區域性變數的生命週期,程式結束的時候,區域性變數才會
被銷毀②並沒有改變區域性變數的作用域
③所有的test函式都共享著乙個變數b
④適用場合:如果某個函式的呼叫頻率特別高,這個函式內部
的某個變數值是固定不變的
void test()
int main()
遞迴:每次呼叫都是重新開闢記憶體空間
條件:①函式本身呼叫本身
②必須有個明確的返回值
問題4:
條件編譯只有符合條件的語句才參與編譯,那麼後面的不符合
條件的語句 即使產生語法錯誤也不會報錯嗎
問題5:
typedef的用法?
IOS學習 C語言基礎學習4
函式 封裝乙個功能 1 什麼情況下定義函式 新增乙個常用的新功能 2 函式的定義格式 返回值型別 函式名 形式引數列表 1 形式引數 定義函式時函式名後面中的引數 2 實際引數 呼叫函式時,傳入的具體資料 3 如果是基本資料型別作為函式形參,純粹是值傳遞,修改函式內部形參的值,並不會影響外面的實參的...
IOS基礎 C語言學習之陣列
一 陣列的基本概念 1.什麼是陣列 陣列,從字面上看,就是一組資料的意思,沒錯,陣列就是用來儲存一組資料的 2.陣列的特點 1 只能存放一種型別的資料,比如int型別的陣列 float型別的陣列 2 裡面存放的資料稱為 元素 二 陣列的定義 1.定義 想要定義乙個陣列,需要宣告兩點 宣告陣列的型別 ...
C語言基礎學習(7) 指標
include void interchange2 int int void interchange1 int u,int v int main void void interchange1 int u,int v void interchange2 int u,int v 函式1只是在形參交換資料...