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
    就是真的