C语言笔记第六章指针和结构类型的关系
第六章指针与结构类型的关系
你可以声明一个指向结构类型对象的指针。
例11:
struct my struct
{
int a;
int b;
int c;
}
MyStruct ss={20,30,40 };//声明结构对象ss,初始
将ss的三个成员转换为20,30,40。
my struct * ptr = & ss;//声明了指向结构对象ss的指针。它的类型是
MyStruct*,它指向的类型是MyStruct。
int * pstr =(int *)& ss;//声明了指向结构对象ss的指针。但是它的
类型不同于它所指向的类型和ptr。
请问如何通过指针ptr访问ss的三个成员变量?
回答:
ptr-> a;
ptr-> b;
ptr-> c;
如何通过指针pstr访问ss的三个成员变量?
回答:
* pstr;//拜访了ss的成员A。
*(pstr+1);//拜访了ss的成员B。
*(pstr+2)//拜访了ss的成员C。
呵呵,虽然我在我的MSVC++6.0里升级了上面的代码,但是你要知道,用p
str访问结构成员是不正常的。为了解释为什么不正常,我们来看看如何通过指向
needle来访问数组的每个单元:
例12:[/br/
int * pa = array;
通过指针pa访问数组三个单元的方式是:
* pa;//访问过的单元0
*(pa+1);//访问过的单元1
*(pa+2);//Visited Unit 2
从格式上看,与通过指针访问结构成员的非正式方法的格式相同。
所有C/C++编译器在排列数组单元时,总是将每个数组单元存储在一个连续的
存储区域中,单元之间没有空的间隙。但是,在存储结构对象的每个成员时,在某种
编译环境下,可能需要进行字对齐、双字对齐或其他对齐方式,需要在两个相邻的
成员之间添加几个“填充字节”,这可能导致每个成员之间有几个字节
空的间隙。
所以,在例12中,即使*pstr访问结构对象ss的第一个成员变量A,
也不能保证*(pstr+1)可以访问结构成员B .因为成员A和成员B之间可能有
几个填充字节,所以可能*(pstr+1)只是访问这些填充字节。这也证明了手指
针的灵活性。如果你的目的是看结构成员之间是否有填充字节,
嘿,这是个好办法。
通过指针访问结构成员的正确方法应该是例12中使用指针ptr的方法。
0条评论