结构体专题

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. 搞定queryString

    querystring字面上的意思就是查询字符串,一般是对http请求所带的数据进行解析.querystring模块只提供4个方法: querystring.parse querystring.str ...

  2. flask框架get post方式

    设置路由的访问方式get post常用的两种 # -*- coding: utf-8 -*- # Flask hello world from flask import Flask, redirect ...

  3. 《Linux性能及调优指南》1.3 Linux文件系统

    翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...

  4. SQL获取连续数字中断数字

    表A -- 创建结果表 create table #u(LostA int) declare @minA int,@maxA int set @minA=(select min(ID) from A) ...

  5. 洛谷 : P3374 【模板】树状数组 1 P3368 【模板】树状数组 2

    ******************************************************************************** 属于模板题了,一个单点修改区间询问,一 ...

  6. 删除n天前的所有目录和文件

    删除目录 find /your_dir/ -maxdepth -type d -mtime + -exec rm -rf {} \; 删除文件 find /目录/ -mtime + -name &qu ...

  7. oracle常用加解密函数

    md5 CREATE OR REPLACE FUNCTION MD5( passwd IN VARCHAR2) RETURN VARCHAR2 IS retval varchar2(32); BEGI ...

  8. Jquery ajax 参数 详解

    Jquery ajax 参数主要如下: url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get ...

  9. JVM总结-Java 虚拟机是怎么识别目标方法(下)

    1. 虚方法调用 在上一篇中我曾经提到,Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用都会被编译成 invokeinterface 指令.这两种指令, ...

  10. webkitAnimationEnd动画事件

    春节终于过完了,自己春节似乎过的有点大,过完春节之后,态度一直没有调整好,总有一股过节的情绪,没有完全进入学习和工作的状态来.继续调整当中…… 这两天项目中遇到一个小需求,十分类似于支付宝蚂蚁森林给小 ...