一前言:
1>下面所用到的實例為:
typedef struct {
int a;
short b[2];
}Ex2;
typedef struct EX {
int a;
char b[3];
Ex2 c;
struct EX *d;
}EX;
2>類型為EX的結構可以用下面的圖表示:
3>可以用下列的方法進行聲明:
Ex x = {10,”hi”,{5,{-1,25}},0};
Ex *px = &x;
二.訪問指針
1.表達式px的右值是:
px是一個指針變量,但此處並不存在任何間接訪問操作符,所以這個表達式的值就是px的內容。
2. 表達式px的左值是
1>它表示了px的舊值將被一個新值所取取代
現在考慮表達式px+1。這個表達式並不是一個合法的左值,因為它的值並不存儲於任何可標識的內存位置。
2>px+1的右值:如果px指向一個結構數組的元素,這個表達式將指向該數組的下一個結構。但,就算如此,這個表達式任然是非法的,因為我們沒有辦法分辨內存下一個位置所存儲的是這些結構元素之一還是其他東西。
三.訪問結構
可以使用*操作符對指針執行間接訪問。
1.表達式*px右值是px所指向的整個結構
間接訪問操作隨箭頭訪問結構,所以使用實現顯示,其結果就是整個結構。
1>你可以把這個表達式賦值給另一個類型相同的結構,2>你也可以把它作為點操作符的左操作數,訪問另一個指定的成員。
3>你可以把它作為參數傳遞給函數,也可以把它作為函數的返回值返回(但是 :這樣做效率不高)
2.表達式*px的左值是:
1>此處,該結構將接受一個新值,或者更准確的說,它將接受它的所有成員的新值。作為左值,重要的是位置,而不是這個位置所保存的值。
2>表達式*px+1是非法的,因為*px的結果是一個結構。C語言沒有定義結構和整型值之間的加法運算。
3>但是*(px+1),如果x是一個數組的元素,這個表達式表示它後面的那個結構。但是,x是一個標量,所以這個表達式實際上是非法的。