结构体专题

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. echo() print() printf() print_r() 的区别

    echo是一个语言结构而非函数,因此它无法被变量函数调用, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用) print()    只能打印出简单类型变量的值(如int ...

  2. 实现textview竖排文字效果

    文字效果

  3. c#类的继承与包含的关系

    基础例子 class Dept { private string name; private Emp emp; public string getName() { return this.name; ...

  4. (error) MOVED 5798 172.17.0.3:6379

    登录没有启动集群模式(即缺少了那个"-c"): redis-cli -c -h yourhost -p yourpost

  5. Android7.0对dlopen的改变——读取私有.so结果变化

    两个内存段 在同一个进程空间中dlopen一个.so文件,理论上在内存中是同一片区域,但实际调试中发现Android7.0(read "/proc/self/maps")中,先后读 ...

  6. mono_image_open_from_data_with_name原型

    mono4.5 https://github.com/Unity-Technologies/mono 查看mono源码: //PATH: /mono/metadata/image.c MonoImag ...

  7. Spark2.0.0源码编译

    Hive默认使用MapReduce作为执行引擎,即Hive on mr,Hive还可以使用Tez和Spark作为其执行引擎,分别为Hive on Tez和Hive on Spark.由于MapRedu ...

  8. sublime 打开import require 模块文件的url 或路径的插件

    结果一番周折,终于发现sublime提供的一个插件(open url)可以实现打开import file 路径的文件,比如import demo from “../path” 的文件在新窗口或者新标签 ...

  9. “javac”不是内部或外部命令的解决办法(JDK1.5 ~ JDK10)

    配置环境变量:计算机 -> 属性 -> 高级系统设置 -> 环境变量 JDK9以后版本(9-10): JAVA_HOME D:\Java\jdk-10 //jdk所在目录 JRE_H ...

  10. Java URLEncoder URLDecoder

    URLDecoder 和 URLEncoder 用于完成普通字符串 和 application/x-www-form-urlencoded MIME 字符串之间的相互转换 URLDecoder类包含一 ...