指標的定義和使用
1.指標是變數,但是指標的位元組長度是固定的。因為指標儲存的是地址,由作業系統的位數決定,32位機的位元組是4,64位機的位元組是8。
2.指標指向的記憶體空間和對應的記憶體空間
我在這裡定義了一個整型指標p儲存num的地址(0x1000),num的地址就是首位元組的地址,而指標p本身的地址為0x2000。下面我們來引入指標的定義:
num對應的記憶體空間為5,指標p對應的記憶體空間為0x1000,指標指向的記憶體空間為5。
num++:對num對應的記憶體空間加1。 5 --> 6
p++:對p對應的記憶體空間加1。(步長) 0x1000 --> 0x1004
(*p)++:對p指向的記憶體空間加1。其中*p是根據p對應的記憶體空間找到其對應的記憶體空間。 5 --> 6
等式:
p == &num
*p == num == *(&num)
下面我們再舉一個例子來進一步說明,如下圖所示
在這裡定義了一個二級指標pp儲存指標p的地址(0x2000),而指標pp本身的地址為0x3000。
pp對應的記憶體空間為0x3000,pp指向的記憶體空間為0x2000。
等式:
num == *p == **pp == *(&num)
p == &pp
3.指標的運算
a.指標 +/- 整數 = 指標所對應的記憶體空間與它所指向的型別乘以整數相加減。eg. p++ --> p = p + 1
b.指標 - 指標 = 兩個指標相差的資料個數。
c.指標的比較:如果兩個指標變數指向同一個陣列的元素,那麼指向前面元素的指標變數小於指向後面元素的指標變數。
d.指標加指標沒有實際意義。
4.萬能指標(void *)
void * 可以表示任意一種型別的指標。我們知道相同指標型別之間才能進行賦值,下面我將舉出一個例子來進行說明
#include <stdio.h>
int main()
{
char *ptr = "hello world";
int *tmp = ptr;
printf("%s\n", tmp);
return 0;
}
main.c: 在函式 ‘main’ 中:
main.c:15: 警告:從不相容的指標型別初始化
我們可以看到不同指標型別之間會出現不相容。使用void * 的時候不會出現警告,但是void * 只能接收,不能取值,一旦取值就會出現段錯誤。
5.指標的使用
當我們給指標賦值的時候,我們要注意指標是否分配了合理的記憶體。如果指標的地址為空,那麼就要在堆上用malloc給它分配空間,這樣可以避免野指標的出現!