void test(void){ //void能夠不寫 //函數體中不用寫返回函數(return) }
test(int a, int b){ //返回值類型能夠不寫,若是不寫,默認爲返回int類型 }
int a = 10; //定義了一個int類型的變量 int *pa = NULL; //定義了一個int類型的指針 pa = &a; //將int類型變量a的地址賦值給pa指針,或者說pa指針指向了變量a *pa = 20; //經過指針簡介修改變量a的值,*稱爲取消引用運算符或間接運算符
//使用char數組存儲字符串,這個叫作字符串變量 char str1[] = 「luoguankun」; //使用指針存儲字符串,它指向字符串的首字母 //這個稱爲字符串常量,若是再聲明一個字符串值同樣的指針字符串 //那麼他們會指向同一 個字符串,而不會建立一個新的 char *str2 = 「luoguankun」;
int *name[5]; name[1] //取出元素下標爲1的元素(指針)
//定義了一個加法函數 int sum(int a, int b){ return a+b; } //將定義好的指針指向函數 //首先聲明一個指針 int (*p)(int,int); //其中(*p)表明未來指向的函數,(*p)左右分別爲返回值類型和形參定義 p = sum; //將指針p指向test函數 p(10,22); //經過指針調用函數,它等於sum(10,22);固然在調用以前別忘了聲明函數
數組只能存儲一組同類型的數據,而結構體能夠保存一組不一樣類型的數據 程序員
//如下定義沒有分配存儲空間,僅僅定義類型 算法
struct Person { int age; int sex; char *name; };
定義結構體變量 數組
struct Person p;
p.age = 13; //一種方式 //另外一種方式,初始化的同時進行賦值,同時進行分配存儲空間 //結構體的存儲空間是最大成員字節數的倍數,稱爲補齊算法 struct Person p = {13,1,」luoguankun」}; p = {13,1,」luoguankun」}; //這是錯誤的!只能在定義結構體時賦值
printf(「age=%d,sex=%d,name=%s」,p.age,p.sex,p.name);
//定義類型的同時定義變量,甚至能夠不寫類型名稱,稱爲匿名結構體,它不能被重用 //而且變量名不能重複 struct Student{ int age; }stu;
//定義結構體類型 struct Person{ int age; double height; char *name; }stu; //定義結構體數組變量並賦值初始化 struct Person stu[3] = { {11,12.1,"o"}, {12,12.2,"u"}, {13,12.3,」l"} }; //循環遍歷結構體數組,並打印 for (int i = 0; i < sizeof(stu) / sizeof(stu[0]); i++) { printf("age=%d,height=%.1f,name=%s\n",stu[i].age,stu[i].height,stu[i].name); } //stu[i] = {4,1.22,」dkdk」}; //這是錯誤的 stu[i].age = 4; //這樣是正確的
//省略類型定義,如上,下面使用結構體變量並賦值初始化 struct Person stu = {11, 1.73, "羅冠坤"}; //定義了一個指針p並指向結構體變量stu struct Person *p = &stu; //三種輸出方法均可以輸出數據,做用相同,其中p->成員名的方式較爲新穎 printf("age=%d,height=%.2f,name=%s\n",stu.age,stu.height,stu.name); printf("age=%d,height=%.2f,name=%s\n",(*p).age,(*p).height,(*p).name); printf(「age=%d,height=%.2f,name=%s\n",p->age,p->height,p->name); //賦值方法的調用方法相同
int main(){ struct Date{ int year; //年 int month; //月 int day; //日 }; struct Student{ int no; //學號 //嵌套兩個Date來分別表示生日和入學日期 struct Date birthday; //生日 struct Date SchoolDay; //入學日期 }; struct Student stu = { 1, {1989,10,24}, {2009, 9, 1} }; //間接取值,嵌套訪問 printf("學號爲:%d\n生日爲:%d年%d月%d日\n入學日期爲:%d年%d月%d日\n", stu.no,stu.birthday.year,stu.birthday.month,stu.birthday.day, stu.SchoolDay.year,stu.SchoolDay.month,stu.SchoolDay.day); return 0; }
//宏名 值; #define //宏的變量名所有是大寫,結尾不須要寫分號 #define COUNT 6 //還能夠取消宏的定義 #undef COUNT
/* 必定要加括號,不然會出現意想不到的結果好比像下面這樣調用 sum(10,10) * sum(10,10); 至關於下面: 10+10*10+10 這樣替換事後改變了運算順序,也就改變了預期的運算結果 因此必定要把全部變量都加上括號 再好比平方的例子必定要像下面這樣寫,每一個形參都要加上括號 #define Square(a)((a)*(a)) */ #define sum(v1,v2)((v1)+(v2)) int main(void){ int result = sum(11,10); printf("result=%d\n",result); //輸出了21 return 0; }
#define A 10 int main(){ //條件編譯判斷若是用到常量值,好比下面的A //則必須得是經過宏定義的,由於在編譯前已經進行了判斷 //條件的括號能夠省略 #if (A == 10) printf("a = 10\n"); #elif (A == 5) printf("a = 5\n"); #else printf("a is other number\n"); #endif //必定要有#endif結尾 return 0; }
當進行多文件開發時,某些函數功能,須要在.h文件中進行聲明,還要將.h文件包含到某個文件中,當代碼量過大時,有可能發生屢次包含,這雖然不會產生錯誤,可是會影響性能,因此在頭文件中能夠利用條件編譯,防止屢次包含頭文件,例如像下面這樣定義頭文件: 函數
/* 解釋下面的寫法的邏輯: 若是沒有定義宏 ABC 那麼就定義一個宏ABC 而且聲明sum()函數 若是第二次被包含時,一樣會進行判斷 此時判斷的條件不成立,由於第一次被包含時已經建立了宏變量ABC 因此這樣一來,避免了重複包含同一個頭文件 ABC宏名稱不能和別的頭文件中的衝突!因此通常使用當前.h頭文件名稱命名 */ // #ifndef等同於#if !define,對應的有#ifdef 等同於 #if define #ifndef ABC // ABC通常寫成當前頭文件的名稱,後面的值隨便寫 #define ABC 11 int sum(int,int); #endif
//須要分號 typedef int MyInt; int main(){ //聲明別名後,能夠這樣定義int類型變量 MyInt i = 10; }
//給指針類型起了一個別名String type char* String; int main(){ String = 「luoguankun」; }
//定義了一個結構體類型Student struct Student { int age; }; //給結構體Student起了個別名叫作Mystu typedef struct Student MyStu; //或者像下面這樣,在定義結構體類型的時候直接起別名,這樣更加精簡 typedef struct Student { int age; }MyStu; //若是像上面這樣給結構體起了別名,定義結構體變量就變成了下面這樣: MyStu s1; MyStu s2; MyStu s3; //還有一種是沒有類型名的結構體 //下面的結構體不能使用本來的方式建立結構體變量 //只能經過下面的方式建立結構體變量,沒法用struct Student stu = {10};這種方式建立結構體變量, //而前面幾種兩種建立結構體變量的方式均可以 //而這個只能像下面這樣建立: //MyStu stu; typedef struct { int age; }MyStu;
//如下是沒有使用typedef定義別名時的枚舉使用 enum Sex {Man, Woman}; enum Sex s = Man; //如下是使用typedef定義別名後的使用方法 typedef enum Sex MySex; MySex s = man; //還能夠在定義枚舉類型的同時定義別名(推薦這樣定義) typedef enum Sex {Man, Woman} MySex; MySex s1 = man;
//定義一個函數 int sum(int a, int b){ return a+b; }
//指向上面函數的指針聲明和調用 int (*p)(int, int) = sum; int result = p(10,20); //使用typedef爲指向函數的指針定義別名 typedef int (*MyPoint)(int, int); MyPoint p = sum; int result = p(20,20);
//簡化前 struct Person{ int age; }; struct Person p = {20}; struct Person *p2 = &p; printf("age = %d\n」, p2->age); //簡化後 typedef struct Person{ int age; } *PersonPoint; struct Person p = {20}; PersonPoint p2 = &p; printf("age = %d\n", p2->age);
6、static對局部變量的做用 性能