我对于学习的C语言的结构体做一个小的学习总结,总结如下:

结构体:structure

结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构。在其他高级语言中称为记录(record)。

声明一个结构体类型的一般形式为:

struct 结构体名{

类型名 成员名1;

类型名 成员名2;

……};

注意: 结构体类型的名字是由一个关键字struct 和结构体名组合而成的如struct Student.

结构体名是由用户指定的,又称“结构体标记”以区别于其他结构体类型。

花括号内是该结构体所包括的子项,称为结构体的成员。对各成员都应进行类型声明。

在定义结构体变量时可以对它的成员变量初始化。是对结构体变量的初始化,而不是对结构体类型。

struct Student b={.name="Zhang Fang"};    //在成员名前有成员运算符“.”

可以引用结构体变量中成员的值,引用方式为

结构体变量名.成员名.如: student1.num=10010;

结构体数组的举例:

例: 有n个学生的信息(包括学号、姓名、成绩),要求按成绩的高低顺序输出各学生的信息。

思路分析:用结构体数组存放n个学生信息,采用选择法择各元素进行排序。

  #include

 struct Student         //声明结构体类型stuct Student

  {int num;

   char name[];

    float score;

    };

 int main()

  {

  struct Student stu[]={{,"Zhang",},{,"Wang"98.5},{,"Li",},{,"Ling",73.5},{,"Sun",}};    //定义结构体数组并初始化

 struct Strudent temp; //定义结构体变量temp用作交换时报的临时变量

 const int n=;             //定义常变量n。这里也可以用符号常量 #define N 5

 int i,j,k;

 printf("The order is :\n");

 for(i=;i

   {k=i;

     for(j=i+;j

        {

         if(stu[j].score>stu[k].score)     //进行成绩比较。

           k=j;

          }

      temp=stu[k];   stu[k]=stu[i];  stu[i]=temp;//互换stu[k]和stu[i]元素

    }

 for(i=;i

    printf("m %8s %6.2f\n",stu[i].num,stu[i].name,stu[i].score);

 printf("\n");

 return ;

  }

结构体指针举例:

1. 指向结构体变量的指针:

 #include

 #include

 int main()

  {

  struct Student

       {

       long num;

       char name[];

       char sex;

        float score;

        };

  struct Student stu_1;   //定义struct Student 类型的变量stu_1

  struct Student*p;       //定义指向struct Student类型数据的指针变量p

   p=&stu_1;                 //p指向 stu_1

 stu_1.num=;       //对结构体变量的成员赋值

 strcpy(stu_1.name,"Li Lin");  //用字符串复制函数给stu_1.name赋值

 stu_1.sex='M';

 stu_1.score = 89.5;

 printf("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f'\n",stu_1.num,stu_1.name,stu_1.sex,stu_1.score);

 //下面用指针访问成员变量输出结果是一样的。

 printf("No.:%ld\nname:%s\nsex:%c\nscore:%5.1f'\n", (*p).num,(*p).name,(*p).sex,(*p).score);

 return ;

   }

 如果p指向一个结构体变量stu,以下三种用法等价:

  .stu.num;

 .(*p).num;

 .p->num;

链表:

链表是动态地进行存储分配的一种结构。

链表有一个头指针变量,它在放一个地址,该地址指向一个元素。链表中每一个元素称为结点,第个结点都应包括两个部分:1.用户需要用的实际数据;2.下一个结点的地址。该元素不再指向其他元素在,它称为表尾,它的地址部分放一个NULL表示空地址,链表到此结束。

建立简单的静态链表:

例:建立一个简链表,它由3个学生数据的结点组成,要求输出各结点为中的数据。

 #include

 struct Student //声明结构体类型struct Student

 {int num;

 float score;

 struct Student*next;

 };

 int main()

 {

 struct Student a,b,c,*head,*p; //定义3个结构体变量a,b,c作为链表的结点

 a.num=;a.score=; //对结点a的num和score成员赋值

 b.num=;b.score=;

 c.num=;c.score=;

 head=&a; //将结点a的起始地址赋给头指针head

 a.next=&b; //将结点b的起始地址赋给a结点的next成员

 b.next=&c; //将c结点的起始地址赋给b的next成员

 c.next=NULL; //将c结点的next成员不存放其他结点地址

 p=head; //使p也指向a结点 

 do {

 printf("%ld %5.1f\n",p->num,p->score);//输出p指向的结点的数据

 p=p->next; //使p指向下一个结点

 }while(p!=NULL); 输出完c结点后p的值为NULL,循环终止。

 return ;

 }

这种所有结点都 是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表。

建立动态链表:

例:写一个函数建立一个有3名学生数据的单向动态链表。

 #include

 #include

 #define LEN sizeof(struct Student)

 struct Student

 {long num;

 float score;

 struct Student*next;

 };

 int n; //n为全局变量,本文件模块中各函数均可使用它

 struct Student*creat(void) //定义函数。此函数返回一个指向链表头的指针 

 {struct Student*head;

 struct Student*p1,*p2;

 n=;

 p1=p2=(struct Student*)malloc(LEN); //开辟一个新单元

 scanf("%ld,%f",&p1->num,&p1->score);//输入第一个学生的学号和成绩

 head=NULL;

 while(p1->num!=)

 {n=n+;

 if(n==)head = p1;

 else p2->next=p1;

 p2=p1;

 p1=(struct Student*)malloc(LEN); //开辟动态存储区,把起始地址赋给p1

 scanf("%ld,%f",&p1->num,&p1->score); //输入其他学生的学号和成绩

 } 

 p2->next=NULL;

 return(head);

 }

 int main()

 {struct Student*pt;

 pt=creat(); //调用creat函数,返回链表第一个结点地址。

 printf("\nnum:%ld\nscore:%5.1f\n",pt->num,pt->score);//输出第一个结点的成员值

 return ;

 }

好啦!今天的学习笔记先写到这里。

01.C语言关于结构体的学习笔记的更多相关文章

  1. C语言链表结构体(学习笔记)

    #include <stdio.h> #define LENTEST 100 // 采取逐步删除的方法求的素数 //先假设1-100都是素数,然后剔除2的倍数, //3的倍数,直到剔除所有 ...

  2. C语言 ---- 函数 结构体 iOS学习-----细碎知识点总结

    函数的定义     返回值类型 函数名(形式参数列表) {        函数的实现     } 函数不允许嵌套定义 如果函数的定义在主调函数之后,那么要进行提前声明才能使用. // 匿名结构体,结构 ...

  3. Go语言 6 结构体、方法和接口

    文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 结构体(struct)是由一系列具有相同类型或不同类 ...

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

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

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

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

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

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

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

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

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

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

  9. 将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. ...

随机推荐

  1. Linux关于watch的用法

    Linux关于watch的用法 2011-07-20      0个评论       收藏    我要投稿 watch 是一个非常实用的命令,基本所有的 Linux 发行版都带有这个小工具,如同名字一 ...

  2. 03server平台delphi程序不支持直接调用webservice

    经过多次测试和查证,发现03server平台用delphi7.0开发的应用程序就是不支持直接调用webservice,无论这个webservice是delphi开发的还是C#开发,抑或是java开发的 ...

  3. UVA 624 CD(01背包+输出方案)

    01背包,由于要输出方案,所以还要在dp的同时,保存一下路径. #include <iostream> #include <stdio.h> #include <stri ...

  4. 为jquery qrcode生成的二维码嵌入图片

    在一次微信项目中,需要实现通过扫描二维码来进行会议签到,二维码的生成选择了qrcode.js的版本,然后使用jquery.qrcode.js插件来绘制二维码. <script type=&quo ...

  5. 14.spark RDD解密

    开篇:spark各种库,sparksql,sparkmachicelearning,等这么多库底层都是封装的RDD.意味着 1:RDD本身提供了通用的抽象, 2:spark现在有5个子框架,sql,S ...

  6. android模拟器(genymotion)+appium+python 框架执行过程中问题解答

    1.case运行过程中中文输入不进去? 答:注意事项 1)需要修改系统编码为utf-8,才能解决中文输入问题,case执行入口文件添加代码如下: import sys reload(sys) sys. ...

  7. lintcode:最小差

    最小差 给定两个整数数组(第一个是数组 A,第二个是数组 B),在数组 A 中取 A[i],数组 B 中取 B[j],A[i] 和 B[j]两者的差越小越好(|A[i] - B[j]|).返回最小差. ...

  8. 欧拉工程第51题:Prime digit replacements

    题目链接 题目: 通过置换*3的第一位得到的9个数中,有六个是质数:13,23,43,53,73和83. 通过用同样的数字置换56**3的第三位和第四位,这个五位数是第一个能够得到七个质数的数字,得到 ...

  9. os 计算机的启动

    零.boot的含义 先问一个问题,”启动”用英语怎么说? 回答是boot.可是,boot原来的意思是靴子,”启动”与靴子有什么关系呢? 原来,这里的boot是bootstrap(鞋带)的缩写,它来自一 ...

  10. Java 类加载器(转)

    java虚拟机中可以安装多个类加载,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap(内嵌在java虚拟机中由C++编写),ExtClassLoader,AppClassLoa ...