moc 发表于 2018-8-20 20:47:34

017-结构体进阶及结构体数组

本帖最后由 moc 于 2018-8-20 21:16 编辑

1、结构体做函数参数
        1.结构体变量名与数组名不一样,他不是代表结构体的首地址,结构体变量名更像定义int a中的a,它代表整个结构体。
        2.两个结构体之间可以用=进行拷贝赋值,但这种赋值是机械的赋值,只是将结构体a中的值机械的备份到结构体b.(特别注意结构体中存在指针)

下面展示,结构体变量做函数参数和结构体指针做函数参数,但要想在被调函数中修改主调函数中的结构体必须用结构体指针做函数参数。
        着重理解函数形参的本质,形参就相当于在被调函数域内新声明的变量,只是这个变量的初值来源于实参,之后的操作便于实参没有半毛钱关系,要想改变实参的是不可能的。但如果实参传给形参的是一个指针,也就是指针做函数参数,可以退而求其次,通过形参(指针)来改变实参(指针)指向内存空间的值。所以在主调函数中分配内存,通过指针做函数,可以在被调函数中修改。
#include "stdlib.h"
#include "stdio.h"
#include "string.h"

// 两个结构体变量之间的copy行为
struct Teacher
{
        char name;// 64
        int age;// 4
};

// 下面只是机械的将实参赋值给形参,不会改变实参的值
//只相当于在被调函数中新定义两个结构体,用=号操作将实参的值给形参,然后就跟实参没有关系啦
void copyObj01(struct Teacher from, struct Teacher to)
{
        memcpy(&to, &from, sizeof(struct Teacher));
}

// 指针做函数,在主调函数中分配内存,在被调函数中修改
void copyObj02(struct Teacher *from, struct Teacher *to)
{
        memcpy(to, from, sizeof(struct Teacher));
}

int main()
{
        struct Teacher t1 = {"tt1", 30};
        struct Teacher t2 = {"tt2", 50 };
        struct Teacher *p = NULL;
        p = &t2;

        // 用memcpy函数完成两个结构体之间的copy,其结果和=号操作是一样的
//        memcpy(&t2, &t1, sizeof(struct Teacher));    ==> t2 = t1;

        copyObj01(t1, t2);
        copyObj02(&t1, &t2);
        printf("%s\n%s\n", t1.name, t2.name);

        system("pause");
        return 0;
}
2、结构体数组
        结构体数组其本质仍是个数组,只是其存放的是结构体而已。需要注意的是结构体数组其数组名也是个一级指针,类型是指向结构体变量的指针常量,也即和struct 结构体名 *p中的p类型一样,但是他两sizeof的结果不一样。(即未退化的指针)。
        在主调函数中分配内存,在被调函数中分配空间(堆),通过指针函数的方式把分配的内存传出来。
下面手工打造结构体数组(未释放):
#include "stdlib.h"
#include "stdio.h"
#include "string.h"

struct Teacher
{
        char name;// 64
        int age;// 4
};

// 通过return的方法把被调函数中分配的内存传出来
struct Teacher * createTArray(int count)
{
        int i = 0;
        struct Teacher*p1 = (struct Teacher *)malloc(count * sizeof(struct Teacher));
        if (p1 == NULL)
        {
                return NULL;
        }

        for (i = 0; i < count; i++)
        {
                //strcpy(p1.name, "abc");
                //printf("%d", p1.age);
                memset(&p1, 0, sizeof(struct Teacher));
                //memset(p1+i, '0', sizeof(struct Teacher)); // 和上面等价
        }
        return p1;
}

void main()
{
        struct Teacher tArray;
        struct Teacher *pa = NULL;
        tArray.age = 10;
        pa = tArray;

        printf("tArray:%d\npa:%d", sizeof(tArray), sizeof(pa));
        pa = createTArray(2);

        system("pause");
}

moc 发表于 2018-8-20 20:50:25

不小心弄成求助贴啦,怎么弄回学习笔记?{:5_107:}

无符号整形 发表于 2018-8-20 20:52:18

moc 发表于 2018-8-20 20:50
不小心弄成求助贴啦,怎么弄回学习笔记?

编辑

moc 发表于 2018-8-20 21:06:02

无符号整形 发表于 2018-8-20 20:52
编辑

谢谢啦
页: [1]
查看完整版本: 017-结构体进阶及结构体数组