本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者。例如:
int(*ptr);
则在32位程序中,有:
sizeof(int(*))==4
sizeof(int)==40
sizeof(ptr)==4
实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。指针和结构类型的关系,可以声明一个指向结构类型对象的指针。
例十一:
structMyStruct
{
inta;
intb;
intc;
}
MyStructss={20,30,40};
//声明了结构对象ss,
并把ss的三个成员初始化为20,30和40。
MyStruct*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上调式过上述代码,但是要知道,这样使用pstr来访问结构成员是不正规的,为了说明为什么不正规,让我们看看怎样通过指针来访问数组的各个单元:
例十二:
intarray={35,56,37};
int*pa=array;
通过指针pa访问数组array的三个单元的方法是:
*pa;
//访问了第0号单元
*(pa+1);
//访问了第1号单元
*(pa+2);
//访问了第2号单元
从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储
所以,在例十二中,即使*pstr访问到了结构对象ss的第一个成员变量a,也不能保证*(