不要傷害指標(2) 指標的型別和指標所指向的型別

2022-04-10 15:51:28 字數 1855 閱讀 4499

在談論指標之前,永遠記住指標的四要素:指標的型別,指標所指向的型別,指標指向的記憶體區,指標自身佔據的記憶體

指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容:指標的型別、指標所指向的型別、指標的值或者叫指標所指向的記憶體區、指標本身所佔據的記憶體區。讓我們分別說明。

先宣告幾個指標放著做例子:

例一:

int *ptr;

char *ptr;

int **ptr;

int (*ptr)[3

];int *(*ptr)[4];

1.指標的型別

從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別。讓我們看看例一中各個指標的型別:

int *ptr;//

指標的型別是int*

char *ptr;//

指標的型別是char*

int **ptr;//

指標的型別是int**

int (*ptr)[3];//

指標的型別是int(*)[3]

int *(*ptr)[4];//

指標的型別是int*(*)[4]

怎麼樣?找出指標的型別的方法是不是很簡單?

2.指標所指向的型別

當你通過指標來訪問指標所指向的記憶體區時,指標所指向的型別決定了編譯器將把那片記憶體區里的內容當做什麼來看待。

從語法上看,你只須把指標宣告語句中的指標名字和名字左邊的指標宣告符*去掉,剩下的就是指標所指向的型別。例如:

int*ptr; //

指標所指向的型別是int

char*ptr; //

指標所指向的的型別是char

int**ptr; //

指標所指向的的型別是int*

int(*ptr)[3]; //

指標所指向的的型別是int()[3]

int*(*ptr)[4]; //

指標所指向的的型別是int*()[4]

在指標的算術運算中,指標所指向的型別有很大的作用。

指標的型別(即指標本身的型別)和指標所指向的型別是兩個概念。當你對c 越來越熟悉時,你會發現,把與指標攪和在一起的"型別"這個概念分成"指標的型別"和"指標所指向的型別"兩個概念,是精通指標的關鍵點之一。我看了不少書,發現有些寫得差的書中,就把指標的這兩個概念攪在一起了,所以看起書來前後矛盾,越看越糊塗。

3.指標的值----或者叫指標所指向的記憶體區或位址

指標的值是指標本身儲存的數值,這個值將被編譯器當作乙個位址,而不是乙個一般的數值。在32 位程式裡,所有型別的指標的值都是乙個32 位整數,因為32 位程式裡記憶體位址全都是32 位長。指標所指向的記憶體區就是從指標的值所代表的那個記憶體位址開始,長度為si zeof(指標所指向的型別)的一片記憶體區。以後,我們說乙個指標的值是xx,就相當於說該指標指向了以xx 為首位址的一片記憶體區域;我們說乙個指標指向了某塊記憶體區域,就相當於說該指標的值是這塊記憶體區域的首位址。

指標所指向的記憶體區和指標所指向的型別是兩個完全不同的概念。在例一中,指標所指向的型別已經有了,但由於指標還未初始化,所以它所指向的記憶體區是不存在的,或者說是無意義的。

以後,每遇到乙個指標,都應該問問:這個指標的型別是什麼?指標指的型別是什麼?該指標指向了**?(重點注意)

4 指標本身所佔據的記憶體區

指標本身佔了多大的記憶體?你只要用函式sizeof(指標的型別)測一下就知道了。在32 位平台裡,指標本身佔據了4 個位元組的長度。

指標本身佔據的記憶體這個概念在判斷乙個指標表示式(後面會解釋)是否是左值時很有用。

不要傷害指標(3) 指標和結構型別的關係

可以宣告乙個指向結構型別物件的指標。struct mystruct struct mystruct ss 宣告了結構物件ss,並把ss 的成員初始化為20,30 和40。struct mystruct ptr ss 宣告了乙個指向結構物件ss 的指標。它的型別是mystruct 它指向的型別是mys...

不要傷害指標(4) 指標和函式的關係

可以把乙個指標宣告成為乙個指向函式的指標.int fun1 char int int pfun1 char int pfun1 fun1 int a pfun1 abcdefg 7 通過函式指標呼叫函式。可以把指標作為函式的形參。在函式呼叫語句中,可以用指標表示式來作為實參。完全可以想象在記憶體的 ...

不要傷害指標(6) 指標的安全問題

看下面的例子 例十八 char s a int ptr ptr int s ptr 1298 指標ptr 是乙個int 型別的指標,它指向的型別是int。它指向的位址就是s 的首位址。在32 位程式中,s 佔乙個位元組,int 型別佔四個位元組。最後一條語句不但改變了s 所佔的乙個位元組,還把和s ...