一前言:
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是一个标量,所以这个表达式实际上是非法的。