天天看點

C基礎學習筆記——01-C基礎第08天(指針上)

在學習C基礎總結了筆記,并分享出來。有問題請及時聯系部落客:​​Alliswell_WP​​,轉載請注明出處。

01-C基礎第08天(指針上)

目錄:

1、指針和指針變量

2、指針大小

3、野指針和空指針

4、萬能指針void *

5、const修飾的指針變量

6、指針和數組

7、多級指針

1、指針和指針變量

(1)記憶體區的每一個位元組都有一個編号,這就是“位址”。

(2)如果在程式中定義了一個變量,在對程式進行編譯或運作時,系統就會給這個變量配置設定記憶體單元,并确定它的記憶體位址(編号)

(3)指針的實質就是記憶體“位址”。指針就是位址,位址就是指針。

(4)指針是記憶體單元的編号,指針變量是存放位址的變量。

(5)通常我們叙述時會把指針變量簡稱為指針,實際他們含義并不一樣。

C基礎學習筆記——01-C基礎第08天(指針上)

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      
C基礎學習筆記——01-C基礎第08天(指針上)

紅框代表不可以這樣操作。

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