C-總結
??
#pragma mark -?第一章:C基礎
void?func1();
void?func1()
{
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????int?a = 030;????????//?以0開頭得數是八進制的數,計算的時候要換算成10進制進行計算
????int?b = a * 10;
????printf("%d", b);????//?此時打印出來的結果是240
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?注釋的嵌套問題
????// 1.?單行注釋可以嵌套單行注釋
????// 2.?單行注釋可以嵌套多行注釋
????// 3.?多行注釋可以嵌套單行注釋
????// 4.?多行注釋不可以嵌套多行注釋(注意項)
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????int?c = 10;
????c++;
????++c;
????//?注意遞增、遞減運算符在前在后的兩種情況,一種是返回新值,一種是返回舊值,還需要注意,不管是返回新值還是返回舊值,運算完之后,c的值都會發生改變
}
?
?
#pragma mark -?第二章:分支結構
void?func2();
void?func2()
{
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????int?a = 10, b = 20;
????BOOL?result = (a++ > 100 && b++ > 20);
????printf("result = %d a = %d b = %d\n", result, a, b);
????//?結果如下,注意?-短路-?情況,邏輯或‘||’也是一樣的
????// result = 0 a = 11 b = 20
????// '&&':一假即假,全真則真
????// '||':一真即真,全假則假
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????enum?Season {
????????spring,
????????summer = 4,
????????autumn,
????????winter
????};
????printf("autumn = %d",?autumn);
????//?結果: 需要注意的是,枚舉變量的值是上一個值?+1
????// autumn = 5
}
?
?
?
#pragma mark -?第三章:循環結構
void?func3();
void?func3()
{
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?隨機數公式:隨機出范圍在a~b之間的隨機數:arc4random() % (b - a + 1) + a;
????int?a = 10, b = 100;
????int?random =?arc4random() % (b - a + 1) + a;
????printf("random = %d\n", random);
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????// break;?關鍵字,跳出本層循環,后面的東西全都不再執行
????// continue;?關鍵字,跳出本次循環,本次循環后面的東西不再執行,下一次繼續執行
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????for?(; ; ) {
????????printf("for循環中的任何條件都可以缺失,只是這種寫法會造成死循環\n");
????}
}
?
?
#pragma mark -?第四章:數組
void?func4();
void?func4()
{
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????int?a[5] = { 2, 7, 4, 3, 6 };
????int?b[5] = { 2, 7, 4 };
????int?c[5] = { 0 };
????int?d[]??= { 2, 7, 4, 3, 6 };
????//?注意這些的區別,個數不寫的話會自動計算,寫了個數不能超,不寫的默認是0
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????int?count = 10;
????// int arr[count] = {0}; //?注意,這種寫法是錯誤的,變量不可以放在數組定義的中括號中,可以是常量和宏定義
????int?arr[10] = {0};
#define kArrayCount?10
????int?arr2[kArrayCount] = {0};
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?系統不會檢測數組下標是否越界,所以我們程序員一定要注意數組下標越界的問題
????//?數組是一個整體,不能直接參加運算,只能對單個元素進行處理,通常用到數組的地方都會用到循環
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?冒泡排序寫法
????int?array[] = {10, 23, 53, 123, 3, 53, 23, 123, 53};
????int?arrayCount =?sizeof(array) /?sizeof(int);
????//?雙層循環
????for?(int?i = 0; i < arrayCount - 1; i++) {
????????for?(int?j = 0; j < arrayCount - 1 - i; j++) {
????????????if?(array[j] > array[j + 1]) {
????????????????int?temp = array[j];
????????????????array[j] = array[j + 1];
????????????????array[j + 1] = temp;
????????????}
????????}
????}
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?字符數組兩種寫法:
????char?str1[] = {'i', 'P', 'h', 'o', 'n', 'e'};
????char?str2[] =?"iPhone";
????//?字符串默認使用?'\0'?作為結束標示,使用雙引號的方式,自帶?'\0' ,?使用數組的方式,需要手動添加?'\0'?才可以成為字符串
}
?
?
#pragma mark -?第六章:函數
void?func6();
void?func6()
{
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?在函數調用的時候,只能調用上面的函數,不能去調用下面的函數,如果想要調用下面的函數,需要在上面進行聲明
????//?函數可以嵌套調用,但是函數不可以嵌套定義
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?函數的形參:出現在函數定義中的變量,值是從實參拷貝過來得
????//?函數的實參:在函數調用的時候傳遞給函數的,可以通過指針的方式修改實參的值
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?普通變量作為參數的時候,修改形參的值,實參的值不會發生變化
????//?當數組作為參數的時候,修改形參的值,實參的值會跟著發生變化,因為,數組作為參數時候,傳遞是的數組的首地址,操作的是同一塊內存區域
}
?
?
#pragma mark -?第七章:結構體
void?func7();
void?func7()
{
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?定義類型
????typedef struct?{
????????char?name[30];
????????int?age;
????????float?score;
????} Student;
????
????//?創建變量
????Student?stu = {"lidaze", 18, 100.0f};
????
????//?訪問成員變量,使用?‘.’?的方式訪問
????printf("name = %s age = %d score = %.2f\n", stu.name, stu.age, stu.score);
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?結構體是可以嵌套的
????//?訪問的時候,使用?'.'?依次找到實例變量進行操作
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?結構體變量可以直接賦值
????//?我們可以通過把數組放在結構體中,實現數組的直接運算
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?結構體內存占用
????//??以最大成員變量類型所占空間為分配單位
????//?按結構體成員聲明順序自上而下分配
????//?注:分配空間不足以存儲成員變量時,分配新的空間單位
}
?
?
#pragma mark -?第八章:指針
void?func8();
void?func8()
{
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?指針的算術運算
????int?a = 10;
????int?*p = &a;
????p++;
????p--;
????//?指針的運算是移動一個單位的長度,這個長度到底是多少個字節,取決于指針的類型
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????// '*'?的作用:
????//?在定義指針中,‘*’?起到告訴編譯器,要聲明的是一個指針
????//?在指針的使用過程中,使用‘*’,此時‘*’是取值運算符,根絕內存地址,拿出這空間內得內容
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?指針與數組
????int?array[] = {123, 42, 52, 5, 32, 535, 35, 343};
????int?*p1 = array;
????//?數組名代表數組的首地址,用指針指向數組的時候,直接把數組名賦給指針變量即可,不需要使用‘&’符號
????//?數組名和指針的使用方式一樣
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?指針與結構體
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?指針與結構體
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?詳細內容見:http://blog.sina.com.cn/s/blog_9c2363ad0102uxlw.html
}
?
?
?
#pragma mark -?第九章:結構體指針
void?func9();
void?func9()
{
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????typedef struct?{
????????char?name[20];
????????int?age;
????} Student;
????
????Student?stu = {"lidaze", 18};
????
????//?指針指向結構體變量,類型需要相同
????Student?*p = &stu;
????
????//?使用指針訪問結構體成員,很特殊,使用?'->'
????printf("name = %s age = %d\n", p->name, p->age);
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?宏定義
#define SUM(a, b) ((a) + (b))
????//?使用宏定義的時候需要注意,尤其是帶參數的宏,最好把每個參數和最外層都加上小括號,防止出錯?
}
?
?
#pragma mark -?第十章:動態內存分配
void?func10();
void?func10()
{
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?內存共分為5個區:
????//?棧區
????//?堆區
????//?靜態區(全局區)
????//?常量區
????//?代碼區
????
????
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?堆內存的管理需要我們手動來管理
????int?*p =?malloc(sizeof(int));?//?分配一塊空間
????*p = 123;
????printf("p = %d\n", *p);
????free(p);?//?使用完成之后需要使用
????// free(p); //?不允許過渡釋放,同時也不允許不釋放,會造成內存泄露
????
????//?開辟內存空間的同時,會把每一個字節清零,效率低,耗費時間,?
????int?*p1 =?calloc(4,?sizeof(int));
????
????//?重新分配空間
????p1 =?realloc(p1,?sizeof(int) * 10);
????
????free(p1);
}
?
?
#pragma mark -?第十一章:函數指針
void?func11();
void?func11()
{
????// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
????//?函數指針:即是指向函數的指針
????//?函數指針的提取:返回值類型?(*) (參數類型)
????// void (*) ():??函數void func11()的類型
????//?使用函數類型的時候太麻煩,給函數類型起個別名
????typedef?void?(*FuncPoint) ();
????
????//?使用指針,指向函數
????FuncPoint?p =?func4;
????
????//?普通調用函數
????func4();
????//?使用指針調用函數
????p();
????
}
?
?
?
#pragma mark -?主函數
int?main(int?argc,?const?char?* argv[])
{
????return?0;
}
?