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

2022-04-10 15:51:27 字數 1288 閱讀 1500

可以宣告乙個指向結構型別物件的指標。

struct

mystruct

;struct mystruct ss = ;//

宣告了結構物件ss,並把ss 的成員初始化為20,30 和40。

struct mystruct *ptr = &ss;//

宣告了乙個指向結構物件ss 的指標。它的型別是mystruct *,它指向的型別是mystruct。

int *pstr = (int*)&ss;//

宣告了乙個指向結構物件ss 的指標。但是pstr的型別和它指向的型別與ptr是不同的。

請問怎樣通過指標ptr 來訪問ss 的三個成員變數?

答案:ptr->a; //指向運算子,或者可以這們(*ptr).a,建議使用前者。注意這裡的(*ptr)就是ss

ptr->b;

ptr->c;

又請問怎樣通過指標pstr 來訪問ss 的三個成員變數?

答案:*pstr; //訪問了ss 的成員a。

*(pstr+1); //訪問了ss 的成員b。

*(pstr+2) //訪問了ss 的成員c。

雖然我在我的msvc++6.0 上調式過上述**,但是要知道,這樣使用pstr 來訪問結構成員是不正規的,為了說明為什麼不正規,讓我們看看怎樣通過指標來訪問陣列的各個單元: (將結構體換成陣列)

例十三:

int array[3] = ;

int *pa = array;

通過指標pa 訪問陣列array 的三個單元的方法是:

*pa; //訪問了第0 號單元

*(pa+1); //訪問了第1 號單元

*(pa+2); //訪問了第2 號單元

從格式上看倒是與通過指標訪問結構成員的不正規方法的格式一樣。

所有的c/c++編譯器在排列陣列的單元時,總是把各個陣列單元存放在連續的儲存區里,單元和單元之間沒有空隙。但在存放結構物件的各個成員時,在某種編譯環境下,可能會需要字對齊或雙字對齊或者是別的什麼對齊,需要在相鄰兩個成員之間加若干個"填充位元組",這就導致各個成員之間可能會有若干個位元組的空隙。

所以,在上面的例子中,即使*pstr 訪問到了結構物件ss 的第乙個成員變數a,也不能保證*(pstr+1)就一定能訪問到結構成員b。因為成員a 和成員b 之間可能會有若干填充位元組,說不定*(pstr+1)就正好訪問到了這些填充位元組呢。這也證明了指標的靈活性。要是你的目的就是想看看各個結構成員之間到底有沒有填充位元組,嘿,這倒是個不錯的方法。不過指標訪問結構成員的正確方法應該是象例十二中使用指標ptr 的方法。

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

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

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

在談論指標之前,永遠記住指標的四要素 指標的型別,指標所指向的型別,指標指向的記憶體區,指標自身佔據的記憶體。指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別 指標所指向的型別 指標的值或者叫指標所指向的記憶體區 指標本身所佔據...

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

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