c语言中的指针和数据结构 typedef结构{ INTA; 短s[2]; }味精; MSG*mp,m={4,1,0}; 字符*fp,*tp; mp=(MSG*)malloc(sizeof(MSG)); 对于(fp=(char*)m.s,tp=(char*)mp->s;tps,其含义是将mp转换为char类型指针,让mp指向s,让tp指向mp
关于这个代码的解释,我需要一些帮助。我读过一些解释,但其中一些我还是不确定c语言中的指针和数据结构 typedef结构{ INTA; 短s[2]; }味精; MSG*mp,m={4,1,0}; 字符*fp,*tp; mp=(MSG*)malloc(sizeof(MSG)); 对于(fp=(char*)m.s,tp=(char*)mp->s;tps,其含义是将mp转换为char类型指针,让mp指向s,让tp指向mp,c,data-structures,C,Data Structures,关于这个代码的解释,我需要一些帮助。我读过一些解释,但其中一些我还是不确定 fp=(char*)m.s其含义是将m.s转换为char类型指针,并让fp指向它。但是m.s是struct中的short[],为什么它会转换为指针 tp=(char*)mp->s,其含义是将mp转换为char类型指针,让mp指向s,让tp指向mp *tp++==*fp++。在2转换之后,在这一行中,由于char和short的大小不同,我不确定它是否有变化以及如何分配 在C语言中,除位字段外的所有对象都是由字节组成的,您可
fp=(char*)m.s
其含义是将m.s
转换为char类型指针,并让fp
指向它。但是m.s
是struct中的short[]
,为什么它会转换为指针tp=(char*)mp->s
,其含义是将mp
转换为char类型指针,让mp
指向s
,让tp
指向mp
*tp++==*fp++
。在2转换之后,在这一行中,由于char和short的大小不同,我不确定它是否有变化以及如何分配在C语言中,除位字段外的所有对象都是由字节组成的,您可以相当容易地访问这些字节。此代码通过复制
m
的s
成员的字节,将其复制到新位置
typedef struct {
int a;
short s[2];
} MSG;
MSG *mp, m = {4, 1, 0};
char *fp, *tp;
mp = (MSG *)malloc(sizeof(MSG));
for (fp = (char *)m.s, tp = (char *)mp->s; tp < (char *)(mp+1);)
*tp++ = *fp++;
这将创建一个指向名为mp
(用于“消息指针”)的-MSG
的指针和一个名为m
的MSG
类型的对象
MSG *mp, m = {4, 1, 0};
为新的MSG
分配内存,并将mp
设置为指向该内存
mp = (MSG *)malloc(sizeof(MSG));
for(fp=(char*)m.s,tp=(char*)mp->s;tp<(char*)(mp+1);)
*tp++=*fp++;
在fp=(char*)m.s
中:m.s
是m
的s
成员。由于它是一个数组,因此会自动转换为指向其第一个元素的指针。然后将该指针从指向-short
的指针转换为指向-char
的指针。然后将fp
(用于“从指针”)设置为指向该字节
在tp=(char*)mp->s
中:mp->s
是mp
指向的MSG
的s
成员。由于它是一个数组,因此会自动转换为指向其第一个元素的指针。然后将该指针从指向-short
的指针转换为指向-char
的指针。然后将tp
(用于“指向指针”)设置为指向该字节
在tp<(char*)(mp+1)
中:mp
指向为MSG
分配的内存<代码>mp+1超出该值一分。指针运算是以指向类型为单位完成的,因此mp+1
是MSG
之后的mp
——如果存在下一个MSG
,则下一个MSG
将从这里开始。这意味着它指向mp
指向的MSG
末尾之后。然后(char*)
将其转换为指向-char
的指针,只要tp
在MSG
范围内,tp
就是真的。当tp
到达MSG
的末尾时,条件为false,循环退出
在*tp++=*fp++代码>,一个字节从fp
点(*fp
)复制到tp
点(*tp
),每个指针递增
(请注意,循环可能复制的字节数超过s
:它从s
开始复制所有字节,直到MSG
结束。结构中可能存在填充,例如如果int
为八个字节,需要八个字节对齐,但short
仅为两个字节,因此short s[2]
成员只有四个字节长,结构需要四个字节才能使其大小为八的倍数。要仅复制s
成员,循环条件可以是tp<(char*)(&mp->s+1)
,使其指向mp->s
的末尾,而不是C中*mp
的末尾,除位字段外的所有对象都由字节组成,您可以相当容易地访问这些字节。此代码通过复制m
的s
成员的字节,将其复制到新位置
typedef struct {
int a;
short s[2];
} MSG;
MSG *mp, m = {4, 1, 0};
char *fp, *tp;
mp = (MSG *)malloc(sizeof(MSG));
for (fp = (char *)m.s, tp = (char *)mp->s; tp < (char *)(mp+1);)
*tp++ = *fp++;
这将创建一个指向名为mp
(用于“消息指针”)的-MSG
的指针和一个名为m
的MSG
类型的对象
MSG *mp, m = {4, 1, 0};
为新的MSG
分配内存,并将mp
设置为指向该内存
mp = (MSG *)malloc(sizeof(MSG));
for(fp=(char*)m.s,tp=(char*)mp->s;tp<(char*)(mp+1);)
*tp++=*fp++;
在fp=(char*)m.s
中:m.s
是m
的s
成员。由于它是一个数组,因此会自动转换为指向其第一个元素的指针。然后将该指针从指向-short
的指针转换为指向-char
的指针。然后将fp
(用于“从指针”)设置为指向该字节
在tp=(char*)mp->s
中:mp->s
是mp
指向的MSG
的s
成员。由于它是一个数组,因此会自动转换为指向其第一个元素的指针。然后将该指针从指向-short
的指针转换为指向-char
的指针。然后将tp
(用于“指向指针”)设置为指向该字节
在tp<(char*)(mp+1)
中:mp
指向为MSG
分配的内存<代码>mp+1
超出该值一分。指针运算是以指向类型为单位完成的,因此mp+1
是MSG
之后的mp
——如果存在下一个MSG
,则下一个MSG
将从这里开始。这意味着它指向mp
指向的MSG
末尾之后。然后(char*)
将其转换为指向-char
的指针,并且只要tp
在消息中,tp
就是真的