大家好,這學期開了一門新課叫做數據結構,c語言版,但是c語言對我來說過於古老,因爲之前參加了校ACM集訓,因此對c++還是比較會用的,c語言一般也不用,但是課程還是能聽懂了...
以上都是我的廢話,那我們就開始學習美妙的數據結構吧。
第一節課:指針與結構體
指針就是指向一個對象的變量,這個變量存儲的數據就是這個對象的地址。
比如說int a; a這個變量就在系統內部分配了一個空間,由於這個變量是int類型,那麼這個變量所佔有的地址是四個,或者說這個變量佔4個格子(也就是四個字節),這四個格子的地址分別是FF70、FF71、FF72、FF73。那麼這個變量的地址呢?這個變量的地址就是FF70。
那麼你可能會問:只有一個內存塊的地址怎麼指向佔有四個字節的變量呢?
這個時候我們就會引入一個新的概念,那就是指針變量的更加細分的類型
我們知道在c語言中會有很多種變量,也會有這些變量的指針指向這些變量,因此對於某種類型的變量,也會有這種類型的指針變量,或者叫做對應這種變量類型的指針變量。比如說char類型的變量,所對應的指針的類型就是char*類型;對於int類型的變量,所對應的指針類型就是int*類型。
取地址符:&
對於變量a,它的地址就是&a,代碼示例如下:
int a;
int *p;//定義整數型指針類型變量p
p = &a;//將a的地址給p
實例開發:自建swap函數
//第一種寫法
void swap(int &a, int &b){
int t = a;
a = b;
b = t;
}
int main(){
int a = 3, b = 4;
swap(a, b);
}
//第二種寫法
void swap(int *a, int *b){
int p = *a;
*a = *b;
*b = p;
}
int main(){
int a = 3, b = 4;
swap(&a, &b);
}
第一種在函數中使用了取地址符,如果形參使用了取地址符那麼這個函數就會改變這個傳入的參數。
第二種函數實際上傳入了地址,實質就是改變兩個數的地址指向,如果p表示一個數的地址,那麼*p就表示這個地址指向的數,對*p賦值,沒有改變*p在內存中的位置,但是改變了*p的值。
結構體:
結構體就是一種數據類型
結構體內的元素可以你自己構建,原則上結構體內部不能加入類型爲自身的結構體,但是可以加入自身類型的指針變量元素(後續會提到鏈表,在這裏瞭解一下即可)
//書上以及輝哥寫的代碼
typedef struct LNode{
int num;
int data;
string str;
}LNode;
//我在算法競賽中經常用的寫法
struct LNode{
int num;
int data;
string str;
};
其中LNode就是一個你定義的類型,之後你可以直接用此類型去定義你想定義的變量。如:
LNode a;//在這裏a就變成了一個結構體類型的變量
LNode b[10];//定義了一個含有10個元素的數組,每個元素的類型是LNode類型
如果你想去訪問或者更改結構體內部的元素應該怎麼做呢?
a.num = 1;
a.data = 2;
a.str = "i love 輝哥!";
那麼,如何通過指針對結構體進行訪問呢?(假如你已經有一個指向這個結構體的指針p)
p = &a;
p->num = 1;//訪問a中的num元素
(*p).data = 2;//訪問a中的data元素
以上有兩種形式可以對其進行訪問。
end~~~~~