首页 > 代码库 > C 结构体小结

C 结构体小结

C 结构体小结

关于结构体的声明:

# include <stdio.h>//第一种方式struct Student{    int age;    float score;    char sex;};//第二种方式struct Student2{    int age;    float score;    char sex;} st2;//第三种方式struct {    int age;    float score;    char sex;} st3;int main(void){    struct Student st = {80, 66.6, F};        return 0;}

 

结构体变量的赋值和初始化:

1.

# include <stdio.h>//第一种方式struct Student{    int age;    float score;    char sex;};int main(void){    struct Student st = {80, 66.6, F}; //初始化  定义的同时赋初值    struct Student st2;    st2.age = 10;    st2.score = 88;    st2.sex = F;    printf("%d %f %c\n", st.age, st.score, st.sex);    printf("%d %f %c\n", st2.age, st2.score, st2.sex);        return 0;}

2.

# include <stdio.h>//第一种方式struct Student{    int age;    float score;    char sex;};int main(void){    struct Student st = {80, 66.6F, F}; //初始化  定义的同时赋初值    struct Student * pst = &st;  //&st不能改成st    pst->age = 88;//第二种方式    st.score = 66.6f; //第一种方式  66.6在C语言中默认是double类型,如果希望一个实数是float类型,则必须在末尾加f或F, 因此66.6是double, 66.6f或66.6F是float    printf("%d %f\n", st.age, pst->score);        return 0;}

 


 

引用 : http://www.cnblogs.com/ligongzi/archive/2012/08/24/2654448.html

struct Student{    char name[20];    char sex;    int age;    char addr[40];};/*然后定义一个Student 类型的 student变量*/struct Student student;

也许是我受了Java影响,我一度写成这样:

struct man{    int age = 30;    int score = 80;};int main(){    man man1  = {20,70};}

  结果是铁定编译通过不了的。因为这是我自创的声明带默认值的结构体,编译器没见过。

结构体成员变量在声明中是不能赋值的。

 

  正确的写法是:

struct Man{    int age; //这样就好了    int score;};int main(){   struct Man man1 = {30,80};}

 定义结构体的时候每次都要写struct 显然是烦琐了,

精炼的C语言用来typedef来方便定义使用:

typedef struct Man{    int age;    int score;}man;int main(){    man man1 = {20,80};    man man2 = {30,70};    man man3 = {40,99};    printf("%d\n",man1.age);    printf("%d\n",man3.score);}

这样一来大家想召唤多少个“男人”都没有问题。另外有一个极端一点的问题,声明结构体名和定义结构体变量名能不能一样?我们可以试试看:

typedef struct man{    int age;    int score;}man;  //还叫man,有意见么?int main(){    man man = {40,50};//还叫man,有问题么?    printf("%d\t%d\n",man.age,man.score);}

编译运行都是没有问题的。不信自己去试试看。

   然后我们来讨论重点吧:

struct Student{    char name[20];    char sex;    int age;    char addr[40];};/*然后定义一个Student 类型的 student变量*/struct Student student;

 

给定义的结构中name和age赋值, 可以用下面语句:

    

     strcpy(student->name, "jack");     student->age=21;     student->name就是(*student).name的缩写形式。

 

 

    需要指出的是结构指针是指向结构的一个指针, 是结构中第一个成员的首地址, 因此在使用之前应该对结构指针初始化, 即分配整个结构长度的字节空间, 这可用下面函数完成, 仍以上例来说明如下:

   

  student=(struct string*)malloc(size of (struct string));

 

    size of (struct string)自动求取string结构的字节长度, malloc() 函数定义了一个大小为结构长度的内存区域, 然后将其诈地址作为结构指针返回。  

    注意:

    结构变量名不是指向该结构的地址, 这与数组名的含义不同,  因此若需要求结构中第一个成员的首地址应该是&[结构变量名]。

 

 demo.

/*    2009年11月24日9:17:43    示例:        发送地址还是发送内容    目的:        指针的优点之一:            快速的传递数据,            耗用内存小            执行速度快*/# include <stdio.h># include <string.h>struct Student{    int age;    char sex;    char name[100];}; //分号不能省void InputStudent(struct Student *);void OutputStudent(struct Student *);int main(void){    struct Student st ;  //15行    //printf("%d\n", sizeof(st));    InputStudent(&st); //对结构体变量输入  必须发送st的地址    OutputStudent(&st); //对结构体变量输出  可以发送st的地址也可以直接发送st的内容 但为了减少内存的耗费,也为了提高执行速度,推荐发送地址    return 0;}void OutputStudent(struct Student *pst){    printf("%d %c %s\n", pst->age, pst->sex, pst->name);}void InputStudent(struct Student * pstu) //pstu只占4个字节{    (*pstu).age = 10;    strcpy(pstu->name, "张三");    pstu->sex = F;    }/*//本函数无法修改主函数15行st的值 所以本函数是错误的void InputStudent(struct Student stu){    stu.age = 10;    strcpy(stu.name, "张三");  //不能写成 stu.name = "张三";    stu.sex = ‘F‘;}*/