结构体的声明,定义和赋值以及所占空间的算法

结构体在C中默认是公有的,包含在<string.h>头文件中。

===============================================================

结构体声明(在函数外):

struct   person   {

char number;

int  age ;

char  name[10] ;

float  high ;

};//person是结构体的数据类型名,可以根据需要随意修改。

//PS:结构体中定义的变量后面要用“;”结尾,声明完也要加“;”。

=====================================================

计算结构体的大小:

遵循一下规律:

1.当前结构体大小是下一个类型的整数倍,否则用字节补齐;

2.总大小是最宽字节的整数倍,否则用字节补齐;(64位是8字节,32位是4字节)

3.数组在结构体中单一拆分进行对齐;long long型和double型在32位中将8字节拆分成2    个4字节;64位则是8字节;

4.补齐的字节中不能存放数据。

如上面的结构体,按32位系统进行计算:

1+3(按规定1,补齐成下一个的1倍)+4+10(按规定3,看成10个1)+4+2(按规定2,补齐为4个倍数)

#pragma  pack(1)

这个表示最宽字节为1,也就是没有补齐,大小为直接相加;

(4)也就是32位的默认,最宽字节为4。

==============================================================

在函数内定义结构体:

struct 【结构体数据类型名】 【结构体变量名】;

方法一:
struct  person  jim ;
    jim.age=30;
    strcpy(jim.name,"jim");//
调用strcpy函数给数组变量赋值
    jim.high=1.73;
   printf("age:%d\n",jim.age);

方法二:

struct preson jim = {
    .age=10,
    .name="jim",
};//PS:和声明不同,定义时,里面定义完变量用“,”结尾,别忘了定义完结构体后最后的“;”

=============================================================

结构体指针的声明和定义:

struct 【结构体数据类型名】*【结构体指针变量名】;


struct person* pa=NULL;

pa=(struct   person*) malloc (sizeof (struct person) );

//在未定义结构体,只定义结构体指针时,要分配一个结构体的空间,否则系统只分配4个字节给指针。

pa->age =10;//用指针指向结构体内数据方法

printf("pa->age:%d\n",pa->age);

free(pa)

==============================================================

在结构体中用函数指针调用函数:

struct person{
    int age;
    char* name;
    int (*peat)(char*);
};
void eat(char* name)
{
    printf("%s\n",name);
}
int main()
{
struct person jim;

jim.peat=eat;
jim.peat("rice");
return 0;
}

结果输出rice

===================================================

结构体类型名的重定义:
typedef  struct  person{
    int age;
    char* name;
}PRE,*PPRE;
 int main()
{
    PPRE a;

    a=(struct person*)malloc(sizeof(struct person));
    a->name ="jim";
    a->age = 10;
    PRE b;
    b.name = "kaka";
    b.age = 21;

    free(a);
    return 0;
}

===========================================================

联合
union person{
    int age;
    char name;
};
int main()
{
    union person a;
    a.age = 10;
    a.name = 'x';
}
所占空间大小为联合体中占用空间最大的类型的大小。联合只有一块空间,重复输值回覆盖当前的值。

================================================================

C++中的结构体
class person{
private:
    int age;
    char* name;
public:
    int eat(char* name)
    {
        printf("%s\n",name);
    }
    int run();
};
int main()
{
    jim.eat("jitui");
    return 0;
}





版权声明:本文为lingfeng2019原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。