6 讓你不再害怕指標 指標和結構型別的關係

2021-05-27 02:09:39 字數 1235 閱讀 6282

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

例十二:

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->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 的方法。

6 讓你不再害怕指標 指標和結構型別的關係

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

6 讓你不再害怕指標 指標和結構型別的關係

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

1 讓你不再害怕指標 細說指標

指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別 指標所指向的型別 指標的值或者叫指標所指向的記憶體區 指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 int ptr 2 char ptr 3 in...