typedef struct MsgData_1
{
char type;
int len;
char msg[10];
}MSG_1;
typedef struct MsgData_2
{
char type;
char len;
char msg[10];
}MSG_2;
void main(void)
{
MSG_1 buf_1;
MSG_2 buf_2;
buf_1.type = '1';
buf_1.len = 6;
memset(buf_1.msg, 0, sizeof(buf_1.msg));
*(buf_1.msg) = 'h';
*(buf_1.msg + 1) = 'e';
*(buf_1.msg + 2) = 'l';
*(buf_1.msg + 3) = 'l';
*(buf_1.msg + 4) = 'o';
*(buf_1.msg + 5) = '!';
buf_2.type = '1';
buf_2.len = '6';
memset(buf_2.msg, 0, sizeof(buf_2.msg));
*(buf_2.msg) = 'h';
*(buf_2.msg + 1) = 'e';
*(buf_2.msg + 2) = 'l';
*(buf_2.msg + 3) = 'l';
*(buf_2.msg + 4) = 'o';
*(buf_2.msg + 5) = '!';
char *a = &buf_1;
char *b = &buf_2;
MSG_1 *c = &buf_1;
}
这段代码除了最后两行,前面都是准备工作,不需要关注,大致就是建立两个结构体并进行赋值,结构体buf_1中有一个char型,一个int型,一个字符串,结构体buf_2中有两个char型,一个字符串。
通过最后两行代码可以充分理解指针指向的类型,先看编译器的结果。
由编译器的编译结果可以看出,a赋值失败,b和c成功被赋值,造成这样结果的原因有以下几个:
- a是指向char型的指针,而buf_1中含有int型,因此赋值失败;
- b是指向char型的指针,而buf_2中全是char型,因此成功赋值;
- c是指向MSG_1型结构体的指针,而buf_1是MSG_1型的,因此复制成功。
因此,当需要一个指针指向某个结构体时,这个指针必须是该结构体类型的,考虑一个问题,怎么把含有各种数据类型的结构体以字符串形式保存。