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
", st.age, st.score, st.sex);
    printf("%d %f %c
", 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
", 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
",man1.age);
    printf("%d
",man3.score);
}

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

typedef struct man
{
    int age;
    int score;
}man;  //还叫man,有意见么?

int main()
{
    man man = {40,50};//还叫man,有问题么?
    printf("%d	%d
",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
", sizeof(st));

    InputStudent(&st); //对结构体变量输入  必须发送st的地址
    OutputStudent(&st); //对结构体变量输出  可以发送st的地址也可以直接发送st的内容 但为了减少内存的耗费,也为了提高执行速度,推荐发送地址

    return 0;
}

void OutputStudent(struct Student *pst)
{
    printf("%d %c %s
", 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';
}
*/
原文地址:https://www.cnblogs.com/mjorcen/p/3816039.html