C語言的指標 鍊錶的原理和各類操作

2021-07-13 16:42:54 字數 3305 閱讀 2024

一、指標

1、運用指標

什麼是指標?什麼是記憶體位址?什麼叫做指標的取值?指標是乙個儲存計算機記憶體位址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數位址,例如int、long和double。指標也可以是void型別、null指標和未初始化指標。

根據出現的位置不同,操作符 * 既可以用來宣告乙個指標變數,也可以用作指標的取值。當用在宣告乙個變數時,*表示這裡宣告了乙個指標。其它情況用到*表示指標的取值。&是位址操作符,用來引用乙個記憶體位址。通過在變數名字前使用&操作符,我們可以得到該變數的記憶體位址。

例如:#include

int main()

;int *ptr = myarray;

printf("ptr位址=%ld,值*ptr=%d\n", ptr,*ptr);

ptr++;

printf("ptr位址=%ld,值*ptr=%d\n", ptr,*ptr);

ptr++;

printf("ptr位址=%ld,值*ptr=%d\n", ptr,*ptr);

ptr++;

printf("ptr位址=%ld,值*ptr=%d\n", ptr,*ptr);

}總結:

指向指標的指標,可以這樣理解,首先指向指標的指標可以把他看成一種特殊的變數,既然是變數就可以儲存不同的元素,比如整形變數int a,a可以儲存2,3,4這種普通的整型資料,只要將值付給a就行了,但指向指標的指標所存的元素比較特殊,存放的元素一般是存放位址的指標變數,比如我有三個指標變數,int *p1,*p2,*p3,那麼我可以定義乙個特殊的變數 int **p,我可以將p1的位址付給p,也可以將p2的位址付給p.比如p=&p1,(類似於int a,int *t,t=&a),那麼p就代表了他所指向的變數p1或者p2的位址,而p所指向的變數是乙個指標變數,*p代表著這個指標變數裡面的值(注意值實際上是乙個位址),**p代表著它所指向的指標變數的內容(位址)所指向的儲存單元的內容(數值)。

二、鍊錶

鍊錶是一種資料結構 ,其最大的的好處就是能夠為資料分配動態記憶體,就不用像一開始那樣先為系統分配乙個都不知道夠不夠用的空間來存貯學生的資訊。

鍊錶,首先可以細分為一小塊一小塊的結構體變數,這一小塊一小塊的結構體變數在鍊錶中是首尾相連的顧名思義 就像一條鐵鍊一樣 而這每一小塊的結構體變數中又可以從大方向地分成兩個部分, 其中乙個部分就是——涵蓋著該結構體變數裡的所有資訊,另乙個部分就是鏈結每塊結構體變數的部分——指標。

例如:typedefstruct node

stud;

這樣就定義了乙個單鏈表的結構,其中char name[20]是乙個用來儲存姓名的字元型陣列,指標*link是乙個用來儲存其直接後繼的指標。定義好了鍊錶的結構之後,只要在程式執行的時候在資料域中儲存適當的資料,如有後繼結點,則把鏈域指向其直接後繼,若沒有,則置為null。

三、指標和陣列的區別

1.宣告的區別

指標:exterenint * x; 

陣列:externint y;

2.指標是儲存資料的位址。

陣列是儲存資料。

3.指標是用於的動態的資料結構。

陣列是用於儲存固定的數目且資料型別相同的資料結構。

陣列一經定義,其基址和大小便固定了,在該陣列的有效使用範圍內是不可變的;

但是指標則具有很強的動態特徵,可以動態地指向任一該型別(定義決定)變數,這也就決定了它 有更大的靈活性。

4.陣列是開闢一塊連續的記憶體空間,陣列本身的標示符代表整個陣列。

指標則是只分配乙個指標大小的記憶體,並可把它的值指向某個有效的記憶體空間。

5.指標是乙個變數,可以被賦值,變數的值是另外乙個變數的位址。那麼,既然指標是變數,那麼指    針必然有自己的儲存空間,只不過是該儲存空間內的值是乙個位址值,而不是別的內容。

陣列名僅僅是乙個符號,不是變數,不可以被賦值,它沒有自己的儲存空間。

6.運算速度上的差異。一般來說,用指標要快些,因為在實際的運算中,總是把陣列下標表示通過儲存映象函式轉換為指標表示,按其位址訪問記憶體,這種轉換要進行乘法和加法的運算。

7.陣列具有較好的可讀性,指標具有更強的靈活性。一般,對某些多維陣列中非連續的元素的隨機訪問用下標表示比較方便,當按遞增(減)順序訪問陣列時,使用指標快捷而且方便。

8.訪問方式:指標是間接訪問,首先取得指標的內容作為位址,再去該位址訪問資料;

陣列是直接訪問,陣列名即是位址。

四、學生姓名管理系統

#include

#include

#include

#include

#define n 3

typedef struct node

stud;

stud * creat(int n) /*建立單鏈表的函式*/

h->name[0]='\0';

h->link=null;

p=h;

for(i=0;i

p->link=s;

printf("請輸入第%d個人的姓名:",i+1);

scanf("%s",s->name);

s->link=null;

p=s;

}return(h);

}stud * search(stud *h,char *x) /*查詢函式*/

if(p==null)

printf("沒有查詢到該資料!");

}stud * search2(stud *h,char*x)

/*另乙個查詢函式,返回的是上乙個查詢函式的直接前驅結點的指標,

h為表頭指標,x為指向要查詢的姓名的指標

其實此函式的演算法與上面的查詢演算法是一樣的,只是多了乙個指標s,並且s總是指向指標p所指向的結點的直接前驅,

結果返回s即是要查詢的結點的前乙個結點*/

}if(p==null)

printf("沒有查詢到該資料!");

}void insert(stud *p) /*插入函式,在指標p後插入*/

printf("請輸入你要插入的人的姓名:");

scanf("%s",stuname);

strcpy(s->name,stuname); /*把指標stuname所指向的陣列元素拷貝給新結點的資料域*/

s->link=p->link; /*把新結點的鏈域指向原來p結點的後繼結點*/

p->link=s;/*p結點的鏈域指向新結點*/

}void del(stud *x,stud *y) /*刪除函式,其中y為要刪除的結點的指標,x為要刪除的結點的前乙個結點的指標*/

void print(stud *h)

}void quit()

void menu(void)

main()}}

李卓群150206321

C語言的指標 鍊錶的原理和各類操作

一 指標 1 運用指標 什麼是指標?什麼是記憶體位址?什麼叫做指標的取值?指標是乙個儲存計算機記憶體位址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數位址,例如int long和double。指標也可以是void型別 null指標和未初始化指標。根據出現的位置不同,...

C語言的指標 鍊錶的原理和各類操作

一 指標 1 運用指標 什麼是指標?什麼是記憶體位址?什麼叫做指標的取值?指標是乙個儲存計算機記憶體位址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數位址,例如int long和double。指標也可以是void型別 null指標和未初始化指標。根據出現的位置不同,...

關於C語言的指標 鍊錶的原理和各類操作

一 指標 1 指標 指標是乙個儲存計算機記憶體位址的變數。從指標指向的記憶體讀取資料稱作指標的取值。指標可以指向某些具體型別的變數位址,例如int long和double。指標也可以是void型別 null指標和未初始化指標。我們在使用c語言進行編寫程式的時候,就一定會使用上指標,指標的操作是編寫程...