慕課網 Linux C語言結構體 學習筆記

2021-09-20 04:37:20 字數 3875 閱讀 3507

.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...