.c檔案->.i檔案->.s檔案->.o檔案->可執行檔案
gcc -o helloworld.i helloworld.c -e
-e表示只讓gcc執行預處理。
vim跳到整個文件底部,命令::$
c語言常量分為直接常量和符號常量:
#define 識別符號 常量值(沒有分號)
hello.c源**:
#include #define r 10
int main()
預處理過之後的**
# 4 "helloworld.c"
int main()
10是直接當做乙個字串來替換。
巨集的本質是在預處理階段發生的單純的字串替換(巨集替換);
在預處理階段,巨集不考慮語法;
#include #define r 10
#define m int main(
m)
預處理是沒有問題的。可以編譯執行。
源**:
#include #define r 10
#define m int main(
#define n(n) n*10
m)
預處理之後:
# 8 "hello.c"
int main()
巨集替換中直接替換的優先順序問題。
#include #define r 10
#define m int main(
#define n(n) n*10
#define add(a,b) a+b
int add(int a,int b)
m)
float d = add(10.5,20.0)
巨集是不考慮資料型別等的。
條件編譯。
注意typedef如果寫在方法體內則只可作用於該作用域內{},#define一直全域性。
#include struct weapon;
int main()
struct 結構體型別名{}在函式中呼叫時 struct 結構體型別名 變數名(前兩部分效果類似定義 int 變數 中的int)
struct weapon weapon_1 = ;
printf("%s\n,%d\n",weapon_1.name,++weapon_1.price);
結構體元素可以和普通變數一樣進行操作。
struct weapon weapon_2[2]=,};
printf("%s\n,%d\n",weapon_2[0].name,weapon_2[1].atk);
struct weapon *w ; //定義乙個指向weapon的w結構體指標
w=&weapon_1; //具體指向weapon_1的記憶體位址
(*w).name
w->name
weapon_1.name //這3種訪問型別都是一樣效果
struct weapon *w;
w = &weapon_1;
printf("---------------------------------\n");
printf("name=%s\n,name=%s\n,name=%s\n",(*w).name,w->name,weapon_1.name);
return 0;
結構體陣列指標。不用取位址符&:陣列的名字代表了這個陣列的記憶體首位址,陣列括號內的長度代表了陣列的單元數,資料型別是int的話就按照int型別(32位系統上是4個位元組)乘以單元數的長度,如果資料型別是結構體的話就按照結構體的長度乘以單元的長度。
p++,不是記憶體位置右移了乙個位元組,而是右移了乙個單元長度的結構體weapon的記憶體長度。所以就不難理解為什麼右移到了第二個結構體例項的首位址上了
struct weapon *p;
p = weapon_2; //p->name weapon_2[0].name
printf("%s\n",p->name);
printf("---------------------------------\n");
p++;// weapon_2 +1 weapon_2[1]
printf("%s\n",p->name);
return 0;
#include struct data;
int main()
a的偏移量0;b的偏移量4,自身大小為1。偏移量是大小的整數倍,不會填充空間;c的偏移量為5,c自身大小為4.要補齊為8.然後加上c自身的4。
所以整個占用12.然後再判斷這個大小12是不是最寬成員的整數倍。
#include union data;
int main()
共用體位址全部相同。
靜態資料結構:
鍊錶:靜態鍊錶;(所有節點都是在程式中定義的,而不是臨時開闢的)
【由三個**資訊的節點組成,所以用結構體型別作為節點元素】
#include struct weapon;
int main()
}
程式執行過程中從無到有的建立起乙個鍊錶,也就是說需要乙個乙個的開闢新節點,輸入新節點的資料,然後建立起前後相連的關係。
建立**資訊的單向動態鍊錶:
#include #include struct weapon;
//【需要乙個建立鍊錶的函式,返回值是鍊錶的頭指標】
struct weapon * create()
p2->next=null;
return (head);
}//p1,p2乙個用來指向鍊錶新創立的節點,乙個用來指向下乙個節點
int main()
按位與
六種位運算子
#include int main()
按位與的應用
#include int main()
輸出為0,1.
#include int main()
輸出為1101:13
按位或的作用:
設定資料的指定位,與255(0xff)做或運算;
b = b| 0xff,能設定資料b的指定二進位制數後8位置為1將參與運算的兩個資料按對應的二進位制數逐位進行邏輯異或運算即b的十進位制等於255
~1000 = 0111
左移:將資料對應的二進位制值逐位左移若干位;高位丟棄,低位補零;乘以2的n次方
右移:將資料對應的二進位制值逐位右移若干位:低位丟棄,高位補0或1(根據符號位判斷,就是正數數補0,負數補1);除以2的n次方
高位丟棄,低位補零
遞迴呼叫有時候會犧牲效率
#include int func(int a)
else if(a==0 || a==1)else
}int main()
慕課網 Linux C語言指標與記憶體 學習筆記
include void change int a,int b int main 上述 無法實現a,b數值的交換。改為指標實現 如下 include void change int a,int b int main 3和5可以成功的交換。需要將實參的位址傳到子函式才能改變實參!a,b c語言 int...
Linux C語言結構體
1.展開標頭檔案 作用 2.進行巨集替換 字串替換 3.預處理階段不考慮c的語法的 下面這句經過處理後 i檔案 tni不會被替換成int的。typedef int tni typedef int p p q null 等同於int q null typedef 有乙個作用域。2.結構體初始化和引用 ...
學自慕課網 MySQL開發技巧
1.常用的sql語句型別 ddl 資料定義語言 tpl 事務處理語言 dcl 資料控制語言 dml 資料操作語言 2.正確使用sql的重要性 增加資料庫處理效率,減少應用相應時間 減少資料庫伺服器負載,增加伺服器穩定性 減少伺服器見通訊的網路流量 3.join型別 內連線 inner 全外連線 fu...