zoukankan      html  css  js  c++  java
  • C语言结构体

    一、结构体的定义

    1、定义形式

    struct 结构名

    {成员列表。};       //定义为语句,分号不能丢

    2、结构类型变量的声明

    (1)声明形式1

    struct student

       int number;

       char name[10];

       float score;

    };

    struct student st1,st2,st3;

    (2)声明形式2

    struct student

    { int number;

       char name[10];

       float score;

    }st1,st2,st3;

    (3)结构体变量的赋值

    如上例:

    struct student

    { int number;

       char name[10];

       float score;

    }st1={101,"wang",87.5};

    3、结构数组的定义

    struct student

    {

       int number;

       char name[10];

       float score;

    }stu[50]={

       {101,"wang",87.5},

       {102,"li",90},

       ...

        };   //定义并初始化50个数组元素,每一个元素均具有结构体student的结构。

    二、结构指针

    1、声明形式

    struct 结构名 *指针变量名      //方法一:须在声明结构指针变量前应已说明该结构体

    struct 结构名

    {

     结构体

    }*指针变量名。    //方法二:与结构体变量一样

    2、结构指针的赋值

    struct student{

    ...

    };

    struct student *p;

    struct student st1={..};

    p=&st1;  //取该结构体变量的首地址

    3、通过结构指针变量訪问结构变量成员

    若st1为上述student结构体变量。p为该结构体指针变量:

    使p=&st1;则可用下列方法訪问st1各成员:

    p->num、p->name、p->score。

    或(*p).num、(*p).name ...

    与st1直接引用:st1.num都能够用来表示st1的成员。

    4、指向结构数组的指针

    struct student

    {

      int num;

      char name[10];

    }stu[10]={...};                //声明并初始化结构数组stu

    struct student *p;            //声明结构指针p

    p=stu;        //对p赋值。指向数组stu首地址

    for(;p<stu+10;p++)           //stu+10表示第10个数组元素的首地址,p++表示指向下一个  数组元素

     printf("%d,%s",p->num,p->name[10]);  //通过指针变量引用结构数组元素的成员

    三、动态存储分配

    1、malloc函数

    在内存动态存储区里分配一块长度为N字节的连续区域,返回值为该内存区首地址,类型说明符表示该内存区存贮的数据类型,(类型说明符*)表示将该返回值指针强制转换成该类型指针:

    (类型说明符*)malloc(N)

    如:

    (int*)malloc(100);   

    (struct student*)malloc(sizeof(struct student));

    2、calloc函数

    (类型说明符*)calloc(n,N) //动态存储区内分配n个长度为N字节的连续区域,返回值为该区首地址,(类型说明符*)表示将该返回值指针强制转换成该类型指针;

    3、free函数

    free(void*ptr);  //释放指针变量ptr指向的一块内存空间,使用free函数前:ptr指向的必须是事先通过malloc或calloc分配的区域。

    四、链表

    怎样分配空间来存储学生的数据?可想到使用结构体数组。但怎样确定学生的数量?新增或删减学生怎样处理?引申出链表描写叙述:

    链表各元素首先均是一个结构体,各个元素称为结点,各结点相应结构体内有一成员为指针变量,指向该结点下一个结点的首地址,第0个结点称为头结点。仅存有指针变量,指向第1个结点。最后一个结点的指针变量成员指向为空(NULL)。

    例:建立一个学生数据的链表结构

    复制代码
    struct student{
    
    char *name;
    
    struct student *pnext;  //指向下一个结点的指针变量,下一结点数据类型为结构体
    
    };        //完毕链表结构声明
    
    int i;
    
    struct student *head,*p1,*pass;
    
    for(i=0;i<N;i++)
    
    {
    
      p1=(struct student*)malloc(sizeof(struct student));//分配一块结点空间
    
      if(i==0)  {head=p1;pass=p1;}        //头结点初始化
    
      else  {pass->next=p1;pass=p1;}    //用pass暂存当前地址,作为中间量传递
    
      printf("input name:
    ");
    
      scanf("%s",p1->name);           //链接结点内容输入
    
      p1->next=Null;           //每次循环当前分配区为最后一个结点,使其指针指向空
    
    }
    
    return  head;      //返回链表头结点
  • 相关阅读:
    LeetCode 123. Best Time to Buy and Sell Stock III (stock problem)
    精帖转载(关于stock problem)
    LeetCode 122. Best Time to Buy and Sell Stock II (stock problem)
    LeetCode 121. Best Time to Buy and Sell Stock (stock problem)
    LeetCode 120. Triangle
    基于docker 搭建Elasticsearch5.6.4 分布式集群
    从零开始构建一个centos+jdk7+tomcat7的docker镜像文件
    Harbor实现容器镜像仓库的管理和运维
    docker中制作自己的JDK+tomcat镜像
    docker镜像制作---jdk7+tomcat7基础镜像
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6760293.html
Copyright © 2011-2022 走看看