在學習C基礎總結了筆記,并分享出來。有問題請及時聯系部落客:Alliswell_WP,轉載請注明出處。
01-C基礎第08天(指針上)
目錄:
1、指針和指針變量
2、指針大小
3、野指針和空指針
4、萬能指針void *
5、const修飾的指針變量
6、指針和數組
7、多級指針
1、指針和指針變量
(1)記憶體區的每一個位元組都有一個編号,這就是“位址”。
(2)如果在程式中定義了一個變量,在對程式進行編譯或運作時,系統就會給這個變量配置設定記憶體單元,并确定它的記憶體位址(編号)
(3)指針的實質就是記憶體“位址”。指針就是位址,位址就是指針。
(4)指針是記憶體單元的編号,指針變量是存放位址的變量。
(5)通常我們叙述時會把指針變量簡稱為指針,實際他們含義并不一樣。

2、指針大小
(1)使用sizeof()測量指針的大小,得到的總是:4或8
(2) sizeof()測的是指針變量指向存儲位址的大小
(3)在32位平台,所有的指針(位址)都是32位(4位元組)
(4)在64位平台,所有的指針(位址)都是64位(8位元組)
3、野指針和空指針
指針變量也是變量,是變量就可以任意指派,不要越界即可(32位為4位元組,64位為8位元組),但是,任意數值指派給指針變量沒有意義,因為這樣的指針就成了野指針,此指針指向的區域是未知(作業系統不允許操作此指針指向的記憶體區域)。是以,野指針不會直接引發錯誤,操作野指針指向的記憶體區域才會出問題。
但是,野指針和有效指針變量儲存的都是數值,為了标志此指針變量沒有指向任何變量(空閑可用),C語言中,可以把NULL指派給此指針,這樣就标志此指針為空指針,沒有任何指針。
4、萬能指針void *
void *指針可以指向任意變量的記憶體空間
1 void *p = NULL;
2
3 int a = 10;
4 p = (void *)&a; //指向變量時,最好轉換為void *
5
6 //使用指針變量指向的記憶體時,轉換為int *
7 *( (int *)p ) = 11;
8 printf("a = %d\n", a);
5、const修飾的指針變量
1 int a = 100;
2 int b = 200;
3
4 //指向常量的指針
5 //修飾*,指針指向記憶體區域不能修改,指針指向可以變
6 const int *p1 = &a; //等價于int const *p1 = &a;
7 //*p1 = 111; //err
8 p1 = &b; //ok
9
10 //指針常量
11 //修飾p1,指針指向不能變,指針指向的記憶體可以修改
12 int * const p2 = &a;
13 //p2 = &b; //err
14 *p2 = 222; //ok
紅框代表不可以這樣操作。
6、指針和數組
數組名字是數組的首元素位址,但它是一個常量,不可以修改。
指針加減運算
(1)指針計算不是簡單的整數相加
(2)如果是一個int *,+1的結果是增加一個int的大小
(3)如果是一個char *,+1的結果是增加一個char大小
指針數組:它是數組,數組的每個元素都是指針類型。
1 #include <stdio.h>
2
3 int main()
4 {
5 //指針數組
6 int *p[3];
7 int a = 1;
8 int b = 2;
9 int c = 3;
10 int i = 0;
11
12 p[0] = &a;
13 p[1] = &b;
14 p[2] = &c;
15
16 for (i = 0; i < sizeof(p) / sizeof(p[0]); i++ )
17 {
18 printf("%d, ", *(p[i]));
19 }
20 printf("\n");
21
22 return 0;
23 }
7、多級指針
(1)C語言允許有多級指針存在,在實際的程式中一級指針最常用,其次是二級指針。
(2)二級指針就是指向一個一級指針變量位址的指針。
(3)三級指針基本用不着,但考試會考。
1 int a = 10;
2 int *p = &a; //一級指針
3 *p = 100; //*p就是a
4
5 int **q = &p;
6 //*q就是p
7 //**q就是a
8
9 int ***t = &q;
10 //*t就是q
11 //**t就是p
12 //***t就是a