结构体专题

01、结构体类型定义及结构体变量定义

    char c1,char c2, char name[62]; int age

    char name[62]; int age,char c1,char c2

    结构体变量的引用 :.

    结构体变量的指针 :->

 

02、结构体做函数参数

    结构体赋值编译器行为研究

    结构体变量做函数参数 PK 结构体指针做函数参数

    结构体做函数参数(//结构体赋值和实参形参赋值行为研究)

    内存四区调用图画法

 

//从键盘获取数据,给结构体变量初始化,并排序,打印结构体

    stack上分配结构数组和heap上分配结构体数组

 

03、结构体开发的常见模型及典型错误用法

    结构体嵌套一级指针

    结构体嵌套二级指针

04、结构体中的深拷贝/浅拷贝

    问题抛出

    解决方法

结构体类型定义及变量定义

/*

结构体类型定义及结构体变量定义;结构体是一种构造数据类型;用途:把不同类型的数据组合成一个整体-------自定义数据类型;结构体类型定义。

*/

//声明一个结构体类型

struct _Teacher

{

    char    name[32];

    char    tile[32];

    int    age;

    char    addr[128];

};

 

//定义结构体变量的方法

/*

1)定义类型 用类型定义变量

2)定义类型的同时,定义变量;

3)直接定义结构体变量;

*/

 

struct _Student

{

    char    name[32];

    char    tile[32];

    int    age;

    char    addr[128];

}s1, s2; //定义类型的同时,定义变量;

 

struct

{

    char    name[32];

    char    tile[32];

    int    age;

    char    addr[128];

}s3,s4; //直接定义结构体变量,匿名结构体

 

//初始化结构体变量的几种方法

//1)

struct _Teacher t4 = {"name2", "tile2", 2, "addr2"};

//2)

struct Dog1

{

    char    name[32];

    char    tile[32];

    int    age;

    char    addr[128];

}d5 = {"dog", "gongzhu", 1, "ddd"};

 

//3)

struct

{

    char    name[32];

    char    tile[32];

    int    age;

    char    addr[128];

}d6 = {"dog", "gongzhu", 1, "ddd"};

//结构体变量的引用

int
main()

{

    //struct _Teacher t1, t2;

    //定义同时初始化

    {

        struct _Teacher t3 = {"name2", "tile2", 2, "addr2"};

        printf("%s\n", t3.name);

        printf("%s\n", t3.tile);

    }

 

    //用指针法和变量法分别操作结构体

    {

        struct _Teacher t4;

        struct _Teacher *pTeacher = NULL;

        pTeacher = &t4;

 

        strcpy(t4.name, "wangbaoming");

 

        strcpy(pTeacher->addr, "ddddd");

        

        printf("t4.name:%s\n", t4.name);

    }

 

    printf("hello....\n");

    getchar();

    return
0;

}

 

结构体做函数参数及结构体数组

//测试两个结构体变量之间可以copy数据吗?

//t2 = t1;

//测试实参传给形参,编译器的行为

//声明一个结构体类型

struct _MyTeacher

{

    char    name[32];

    char    tile[32];

    int    age;

    char    addr[128];

};

 

void
printfMyteach01(struct _MyTeacher t)

{

    printf("\nt.name:%s", t.name);

}

 

void
printfMyteach02(struct _MyTeacher *t)

{

    printf("\nt->name:%s", t->name);

}

//结构体赋值和实参形参赋值行为研究

int
main1()

{

    struct _MyTeacher t1, t2;

    memset(&t1, 0, sizeof(t1));

 

    strcpy(t1.name, "name");

    strcpy(t1.addr, "addr");

    strcpy(t1.tile, "addr");

    t1.age = 1;

 

    //测试两个结构体变量之间可以copy数据吗?

    //t2 = t1;

    //测试实参传给形参,编译器的行为

    //是可以的

    printfMyteach01(t1);

 

    printfMyteach02(&t1);

 

    getchar();

    return
0;

}

 

//定义结构体数组

int
main()

{

    int i = 0;

    struct _MyTeacher teaArray[3];

    struct _MyTeacher *tmp = NULL;

    for (i=0; i<3; i++)

    {

        strcpy(teaArray[i].name, "aaaaa");

        //printf("%s", teaArray[i].name);

        tmp = &teaArray[i];

        printf("%s", tmp->name);

    }

    getchar();

    return
0;

}

例子

从键盘接受数据。。。。并排序

int
printfArray(struct _MyTeacher *teaArray, int count)

{

    int i = 0;

    //打印

    for (i=0; i<count; i++)

    {

        printf("\n教师名字:");

        printf("%s", teaArray[i].name);

        printf("\n教师年龄:");

        printf("%d", teaArray[i].age);

    }

 

}

int
main23()

{

    int i = 0, j = 0;

    struct _MyTeacher teaArray[3];

 

    struct _MyTeacher tmp;

 

    for (i=0; i<3; i++)

    {

        printf("\n请键入教师名字:");

        scanf("%s", teaArray[i].name);

        printf("\n请键入教师年龄:");

        scanf("%d", &teaArray[i].age);

    }

 

    for (i=0; i<3; i++)

    {

        for (j=i+1; j<3; j++)

        {

            if (teaArray[i].age >teaArray[j].age)

            {

                tmp = teaArray[i];

                teaArray[i] = teaArray[j];

                teaArray[j] = tmp;

            }

        }

    }

 

    //打印

    for (i=0; i<3; i++)

    {

        printf("\n教师名字:");

        printf("%s", teaArray[i].name);

        printf("\n教师年龄:");

        printf("%d", teaArray[i].age);

    }

 

    printf("ddddd\n");

    printfArray(teaArray, 3);

 

    system("pause");

 

}

 

结构体在开发中的应用

//测试输入

//测试打印

//测试malloc

//测试typdef用法

//定义结构体数组

 

struct _Student

{

    char    name[32];

    char    tile[32];

};

 

//声明一个结构体类型

struct _itTeacher

{

    char    name[32];

    char    tile[32];

    int        age;

    char    addr[128];

};

 

struct _itAdvTeacher

{

    char    *name;

    char    *tile;

    int        age;

    char    *addr;

    char    *p1;

    char    **p2;

};

 

 

//测试输入

//测试打印

//测试malloc

//测试typdef用法

 

//定义结构体数组

int
main()

{

    int i = 0;

    struct _itTeacher teaArray[3];

    struct _itTeacher *tmp = NULL;

    for (i=0; i<3; i++)

    {

        strcpy(teaArray[i].name, "aaaaa");

        //printf("%s", teaArray[i].name);

        tmp = &teaArray[i];

        printf("%s", tmp->name);

    }

    getchar();

    return
0;

}

 

//内存四字节对齐

//结构体实参传给形参,也是一个值copy,相当于t1 = t2;

//两个结构体变量之间确实是可以copy,这个是编译器的行为


 

C语言复习:结构体的更多相关文章

  1. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  2. C语言的结构体和C++结构体的区别

    关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的 ...

  3. 01.C语言关于结构体的学习笔记

    我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...

  4. C语言中结构体对齐问题

    C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...

  5. 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

    逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...

  6. C语言中结构体赋值问题的讨论(转载)

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  7. go语言学习-结构体

    结构体 go语言中的结构体,是一种复合类型,有一组属性构成,这些属性被称为字段.结构体也是值类型,可以使用new来创建. 定义: type name struct { field1 type1 fie ...

  8. 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct

    https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...

  9. [日常] Go语言圣经--结构体,JSON习题

    Go语言圣经-结构体 1.结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体 2.通常一行对应一个结构体成员,成员的名字在前类型在后,不过如果相邻的成员类型如果相同的话可以被合并到一行 ...

随机推荐

  1. 哈希表(Hash Table)原理及其实现

    原理 介绍 哈希表(Hash table,也叫散列表), 是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映 ...

  2. [UE4]创建游戏、加入游戏

    google搜: UE4 compile dedicated server,编译UE4专用服务器 UE4默认网络端口可以在引擎配置文件中修改: 一.创建文件.需要修改一下工程的配置文件DefaultE ...

  3. Pyhton基础知识(一)

    Pyhton基础知识(一)一.cpu 内存 硬盘 操作系统之间的关系1.cpu 中央处理器 运算中心与控制中心 相当于人的大脑.2.内存 暂时存储数据 将应用程序加载到内存 以便于cpu进行数据传输交 ...

  4. MySQL建立索引,触发器

    创建索引: ALTER TABLE <表名> ADD INDEX (<字段>); >ALTER TABLE `table_name` ADD PRIMARY KEY (` ...

  5. PLMN概念和应用设置

    PLMN概念和应用设置   1 PLMN概念 PLMN: PLMN(Public Land Mobile Network,公共陆地移动网络) 该网路必须与公众交换电话网(PSTN)互连,形成整个地区或 ...

  6. 使用命名管道的OVERLAPPED方式实现非阻塞模式编程 .

    命令管道是进程间通讯的一种常用方式,对于命令管道的介绍可以参考别的资料和书籍,这里推荐一个<VC++下命名管道编程的原理及实现>这篇博文,写得比较清楚.但是都是介绍了阻塞模式的编程,我这里 ...

  7. Java - 22 Java 多态

    Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力. 多态性是对象多种表现形式的体现. 比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫.小狗.蜥蜴 ...

  8. oracle补齐日期

    生成日期列表 SELECT to_date( as first_login_day, ROWNUM - FROM DUAL CONNECT BY ROWNUM <= trunc(sysdate ...

  9. Ubuntu 16.04 fatal: Unable to find remote helper for 'https'

    在Windows10 的Linux子系统下安装oh-my-zsh的时候出现如下错误: fatal: Unable to find remote helper for 'https' 网上有描述说没有安 ...

  10. android 开发 碎片Fragment布局例子(用按键切换碎片布局)

    实现思路: 1.写一个父类布局,里面写一个按键和一个帧布局(用于给Fragment布局后续替代) 2.写3个子布局,并且在写3个class继承Fragment布局 3.在MainActivity的cl ...