指標學習心得與理解
在C語言的學習過程中,指標是相當重要的一部分,學好指標對C的學習有很重要的意義。
指標和記憶體
如果說記憶體相當於街道,那麼地址就相當於位於街道中房子的房號。
一個位元組(8bit)包含一個地址。記憶體中每一個位置都包含一個獨一無二的地址標識,而每一個位置都包含一個值。
注意:①區別指標變數的內容(即地址)、指標指向變數的內容、指標的地址。
②*p分別作為左值和右值時具有不同的意義
*p放在“=”左邊表示p指向的空間
*p放在“=”右邊表示解引用p
③在對指標進行初始化的時候有兩種非法情況
如:int *pa;→這是未初始化的指標,這種做法是不行的
*pa=10;
int *pret=fun();→這是個非法的指標,不能將一個函式直接賦給一個指標變數
*pret=20;
2.指標常量
例:
*((int *)0x0018ff44)=20
其中0x0018ff44是一個常量,不能直接引用,需強制型別轉換為一個整型地址
改為:int a=10;
*((int *)0x0018ff44)=30;
此時a=30;
3.指標的指標
例:①int *p=NULL;
int **ptr=&p;→二級指標變數儲存一級變數的地址
②int a=10;
int *p=&;→想要將a的內容變成20,則可以寫成*p=20或者**q=20
4.指標運算
①對於一個指標變數*p,p+n後增加的位元組取決於p的資料型別,如果是一個char型別的,則增加n個位元組,如果是一個int型別的,則增加n*4個位元組。
②指標1-指標2之間的元素等於指標1和指標2之間元素的個數
③允許指向陣列元素的指標與指向陣列最後一個元素的指標進行比較,但不允許與指向第一個元素之間的記憶體進行比較。
例:用指標實現一個氣泡排序的函式
void bubble_sort(int arr[], int sz) { int i = 0; int j = 0; int tmp = 0; for (i = 0; i < sz; i++) { for (j = 0; j <= sz - i - 1; j++) { if ((*arr + j)>(*arr + j + 1)) tmp = *(arr + j); *(arr + j ) = *(arr + j+1); *(arr + j + 1) = tmp; } }
學習初始,不足之處望指正。