資料結構 -- 筆記
預備知識
一.指標
我們將記憶體中位元組的編號稱為位址(address)或指標(pointer)。位址從 0 開始依次增加,對於 32 位環境,程式能夠使用的記憶體為 4gb,最小的位址為 0,最大的位址為 0xffffffff。
c語言用變數來儲存資料,用函式來定義一段可以重複使用的**,它們最終都要放到記憶體中才能供 cpu 使用。
資料和**都以二進位制的形式儲存在記憶體中,計算機無法從格式上區分某塊記憶體到底儲存的是資料還是**。當程式被載入到記憶體後,作業系統會給不同的記憶體塊指定不同的許可權,擁有讀取和執行許可權的記憶體塊就是**,而擁有讀取和寫入許可權(也可能只有讀取許可權)的記憶體塊就是資料。
cpu 只能通過位址來取得記憶體中的**和資料,程式在執行過程中會告知 cpu 要執行的**以及要讀寫的資料的位址。如果程式不小心出錯,或者開發者有意為之,在 cpu 要寫入資料時給它乙個**區域的位址,就會發生記憶體訪問錯誤。這種記憶體訪問錯誤會被硬體和作業系統攔截,強制程式崩潰,程式設計師沒有挽救的機會。
cpu 訪問記憶體時需要的是位址,而不是變數名和函式名!變數名和函式名只是位址的一種助記符,當原始檔被編譯和鏈結成可執行程式後,它們都會被替換成位址。編譯和鏈結過程的一項重要任務就是找到這些名稱所對應的位址。
假設變數 a、b、c 在記憶體中的位址分別是 0x1000、0x2000、0x3000,那麼加法運算c = a + b;將會被轉換成類似下面的形式:
0x3000 = (0x1000) + (0x2000);
( )表示取值操作,整個表示式的意思是,取出位址 0x1000 和 0x2000 上的值,將它們相加,把相加的結果賦值給位址為 0x3000 的記憶體
需要注意的是,雖然變數名、函式名、字串名和陣列名在本質上是一樣的,它們都是位址的助記符,但在編寫**的過程中,我們認為變數名表示的是資料本身,而函式名、字串名和陣列名表示的是**塊或資料塊的首位址。
二.結構體
1.結構體是使用者根據自己需要定義的資料型別
例如:
struct或
typedef struct student;//分號不能省略
int main()
;st.age=20;//第一種方式
printf("%d %s %d\n",st.sid,st.name,st.age);//訪問結構體內部時應通過自定義資料型別元素名稱加.的方式 而不能直接使用st
st.name="lisi";//這樣是錯誤的 字串的賦值應用strcpy(st.name,"lisi");
//初始化字串時可以直接用』=『初始化
//第二種方式
struct student *pst;
pst=&st;//pst指向st的首位址
pst->sid=99;//等價於(*pst).std 而*pst等價於st 總體 等價於st.sid
}結構體也是一種資料型別,它由程式設計師自己定義,可以包含多個其他型別的資料。
2.如何使用結構體
struct student st=;
st.age=20;//第一種方式
struct student *pst;
pst=&st;
即1.st.sid
2.pst->sid pst所指向結構體變數中sid這個成員
3.注意事項
1.結構體變數不能加減乘除,但能相互賦值 如st1=st2
像 int、float、char 等是由c語言本身提供的資料型別,不能再進行分拆,我們稱之為基本資料型別;而結構體可以包含多個基本型別的資料,也可以包含其他的結構體,我們將它稱為複雜資料型別或構造資料型別。
結構體變數
關於資料結構的一些預備知識
在這裡 應該是用c語言來進行編寫 關於指標的知識 int p p 指的是 乙個指標變數 是乙個變數名字 int 表示該p變數只能儲存int型別變數的位址 int pint i 10 int j p i 這個含義就是將i的位址傳送給p 則意味著p指向i p 則就是i變數 修改p或是i的值 並不會對雙方...
c語言資料結構預備知識
1 定義 a.位址 記憶體單元的編號 從0開始的非負整數 b.指標 指標就是位址,位址就是指標 指標變數是存放記憶體單元位址的變數 指標的本質是乙個操作受限的非負整數 2 基本型別的指標int i 10 int p i 等價於int p p i p 11 printf d d i,p 11 11總結...
基於C語言資料結構 一些錯誤
include stdio.h include malloc.h define maxsize 50 typedef char elemtype typedef struct lnode linklist void initlist linklist l void getelem linklist ...