精华内容
下载资源
问答
  • C语言结构体及结构体变量
    千次阅读
    2021-05-20 07:55:45

    一、结构体类型的定义

    结构体是一种新数据类型,属构造类型,它由若干类型各异的“成员”组成;描述这些“成员”可以使用任何基本数据类型,甚至是另外一种构造数据类型都行。

    其实,从本书开篇,就在定义变量,下边的语句我们已经习以为常了:

    int i;

    我们用整数类型去定义了一个变量 i ,之所以能这样,是因为 int 类型是基本类型, C 语言系统已经定义好了的。而结构类型是程序员自己定义的,是对 C 语言基本数据类型的扩充,可以理解为是程序员发明的,所以“要定义结构类型的变量,必须先定义结构类型本身”就顺理成章了。

    区别结构体名、结构变量名,掌握通过结构变量访问其成员的方法是学好本章的关键。

    打个比方,我们定义一种结构类型( person )描述青年,青年由几个基本属性(即成员)决定( name , color , sex , age 等),显然描述这些属性只需要用到基本数据类型就够了。我们可以用这个结构类型 person 去定义一个具体的青年人 zhangshan , zhangshan 则称为结构变量名。如果有 100 个青年人组成了班,那么我们可以把他们定义为一个数组 class_one[100] ,该数组称为结构数组。

    每一种具有不同成员的结构体就是一个新的数据类型,所以,在说明和使用结构体之前必须作结构类型的定义。定义结构类型使用关键字“ struct ”。

    下边几行定义结构类型 person ,并用该类型定义结构变量 zhangshan 和结构数组 class_one[100] :

    现在,再定义一个商品结构类型 goods ,设商品包含属性有:商品名、商品代码、厂商、单价、质量。把相同类型的成员定义在一行, goods 可定义如下:

    struct 是结构体的关键字, goods 是结构体名,花括号内的所有变量是这个结构体的成员。这种写法虽然节省了程序行,但降低了可读性,故不建议初学者这样写。

    综上,结构体类型简称为结构类型,其定义格式为:

    二、结构体类型变量的定义

    结构体变量简称为结构变量,它由结构类型定义,有三种定义方法。下面以定义结构类型 book 和结构变量 mybook 、 storybook 为例说明之。

    先定义结构类型,再定义结构变量。

    用这种方法定义结构变量,是最常用的方法,但须注意不能省略关键字“ struct ”。还可以在定义结构变量的同时给它的成员赋初值。如:

    则, mybook 变量的 price = 24.7 。

    定义结构类型的同时定义结构变量。

    不定义结构类型,直接定义结构变量。

    需要说明的是,当某结构类型的成员又是另外一个结构类型时,称嵌套定义,其定义方法如下:

    此例直接定义了 student_01 和 employee 两个变量,但是没有定义此结构体的名字,因此不能再定义与 student_01 和 employee 同类的其它结构变量了!如下行定义是错误的:

    truct boy, girl;

    更多相关内容
  • C 语言允许用户自己指定这样一种数据结构,它由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的,这样的数据结构称为结构体,它相当于其它高级语言中记录。 声明一个结构休类型的...

    1、概述

    C 语言允许用户自己指定这样一种数据结构,它由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的,这样的数据结构称为结构体,它相当于其它高级语言中记录。

    声明一个结构休类型的一般形式如下:

    struct 结构体名
    {成员列表};
    

    结构体名,用作结构体类型的标志,它又称 结构体标记,大括号内是该结构体中的各个成员,由它们组成一个结构体,对各成员都应进行类型声明如:

    类型名 成员名;
    

    也可以成员列表称为域表,第一个成员也称为结构体中的一个域。成员名定名规则写变量名同。

    struct student
    {
        int num;
        char name[20];
        char sex;
        int age;
        float score;
        char addr[30];
    };
    

    2、定义结构体类型变量的方法

    前面只是指定了一个结构体类型,它相当于一个模型,但其中并无具体数据,系统对之也不分配实际内存单元,为了能在程序中使用结构类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据,可以采取以下3种方法定义结构体类型变量。

    (1)先声明结构体类型再定义变量名

    如上面已定义了一个结构体类型 struct student,可以用它来定义变量。如:

    struct student{  //结构体类型名
        ...
        ...
        ...
    }student1, student2 //结构体变量名
    

    定义了 student1, student2 为 struct student 类型的变量。

    在定义了结构体变量后,系统会为之分配内存单元。例如 student1 和 student2 在内存中各占 59 个字节。

    应当注意,将一个变量定义为标准类型(基本数据类型)与定义为结构体类型不同之处在于后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型(例如 struct student 类型),因为可以定义出许多种具体的结构体类型。而在定义变量为整形时,只需指定为 int 型即可。

    (2)在声明类型的同时定义变量

    例如:

    struct student
    {
        int num;
        char name[20];
        char sex;
        int age;
        float score;
        char addr[30];
    }student1, student2;
    

    它的作用与第一种方法相同,即定义了两个 struct student 类型的变量 student1, student2 这种形式的定义的一般形式为

    struct 结构体名
    {
        成员表列
    }变量名表列;
    

    (3)直接定义结构类型变量

    其一般形式为:

    struct
    {
        成员表列
    }变量名表列;
    

    即不出现结构体名。

    关于结构体类型,有几点要说明:

    • a. 类型与变量是不同的概念,不是混同,只能对变量赋值,存取或运算,而不能对一个类型赋值,存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。

    • b. 对结构体中的成员(即 域)可以单元使用,它的作用与地位相当于普通变量。

    • c. 成员也可以是一个结构体变量。如:

      struct date // 声明一个结构体类型
      {
          int month;
          int day;
          int year;
      }
      
      struct student
      {
          int num;
          char name[20];
          char sex;
          int age;
          struct date birthday;
          char addr[30];
      }student1, student2;
      

      先声明一个 struct date 类型,它代表 日期 包括3个成员 month, day, year。然后在声明 struct student 类型时,将成员 birthday 指定为 struct date 类型。

    • d. 成员名可以与程序中的变量名相同,二者不代表同一对象。


    3、结构体变量的引用

    (1)不能将一个结构体变量作为一个整体进行输入和输出。

    只能对结构体变量中的各个成员分别进行输入输出。引用结构体变量中的成员的方式为:

    结构体变量名.成员名
    

    例如 student1.num 表示 student1 变量中的 num 成员,即 student1 的 num 项,可以对变量的成员赋值。例如: student1.num = 10010;

    . 是成员(分量)运算符,它在所有的运算符中优先级最高,因此可以把 student1.num 作为一个整体来看待。上面的赋值语句作用是将整数 10010赋给 student1 变量中的成员 num。

    (2)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。只能对最低的成员进行赋值或存取以及运算。

    例如:结构体变量 student1 可以这样访问各成员:

    student1.num
    student1.birthday.month
    

    注意,不能用 student1.birthday 来访问 student1 变量中的成员 birthday,因为 birthday 本身是一个结构体变量。

    3)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。

    student2.score = student1.score;
    sum = student1.score + student2.score;
    student1.age ++;
    ++ student1.age;
    

    由于 . 运算符的优先级最高,因此 student1.age ++ 是对 student1.age 进行自加运算。而不是先对 age 进行自加运算。

    (4)可以引用结构体变量成员的地址。也可以引用结构体变量的地址。如:

    scanf("%d", &student1.num);// 输入 student1.num 的值
    printf("%o", &student1);// 输出 student1 的首地址
    

    但不能用以下语句整体读入结构体变量如:

    scanf("%d,%s,%c,%d,%f,%s", &student1);
    

    结构体变量的地址主要用于作函数参数,传递结构体的地址。


    4、结构体变量的初始化

    和其它类型变量一样,对结构体变量可以在定义时指定初始值。

    实例

    typedef struct mystruct
    {
    	const char* name;
    	long int age;
    	float score;
    }my;
    
    typedef struct teacher
    {
    	int name;
    	my student;
    	const char* ping;
    }tec;
    
    tec system;
    
    void zero(mystruct t)
    {
    	t.name = "张信哲";
    	t.age = 18;
    	t.score = 98.2;
    }
    
    
    void one(mystruct t[])
    {
    	t[0].name = "张三";
    	t[0].age = 20;
    	t[0].score = 99.9;
    	t[1].name = "张飞";
    	t[1].age = 88;
    	t[1].score = 99.111;
    }
    
    void two(tec system)
    {
    	system.name = 01;
    	system.student;
    	system.ping = "A+";
    }
    

    5、结构体数组

    一个结构体变量中可以存放一组数据(如一个学生的学号,姓名,成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数据值型数组不同之处在于每个数组元素都一个结构体类型的数据,它们分别包括各个成员(分量)项。

    (1) 定义结构体数组

    和定义结构体变量的方法相仿,只需说明其为数组即可。

    struct student
    {
        int num;
        char name[20];
        char sex;
        int age;
        float score;
        char addr[30];
    };
    struct student stu[3];
    

    以上定义了一个数组 stu,其元素为 struct student 类型数据,数组有 3 个元素。也可以直接定义一个结构体数组。如:

    struct student
    {
        int num;
        ....
    
    }stu[3];struct
    
    {
        int num;
         ...
    }stu[3];
    

    (2) 结构体数组的初始化

    与其它类型数组一样,对结构体数组可以初始化如:

    struct student
    {
        int mum;
        char name[20];
        char sex;
        int age;
        float score;
        char addr[30];
    }stu[3] = {{10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"},
                {10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"},
                {10101,"Li Lin", 'M', 18, 87.5, "103 Beijing Road"}};
    

    定义数组 stu 时,元素个数可以不指定,即写成以下形式:

    stu[] = {{...},{...},{...}};
    

    编译时,系统会根据给出初值的结构体常量的个数来确定数组元素的个数。

    当然,数组的初始化也可以用以下形式:

    struct student
    {
        int num;
        ...
    };
    struct student stu[] = {{...},{...},{...}};
    

    即先声明结构体类型,然后定义数组为该结构体类型,在定义数组时初始化。

    展开全文
  • 输入三学生的个人信息 包含学号 姓名和三门学科的成绩 输出平均成绩最高的学生的学号 姓名 各科成绩以及平均成绩 代码如下(谭浩强c程序设计的例子)#include<stdio.h>struct Student {int num; ...

    输入三个学生的个人信息 包含学号 姓名和三门学科的成绩
    输出平均成绩最高的学生的学号 姓名 各科成绩以及平均成绩
    代码如下(谭浩强c程序设计的例子)

    #include<stdio.h>
    
    struct Student
    {int num;
    char name[20];
    float score[3];
    float aver;
    };
    
    int main()
    {
        void input(struct Student stu[]);
        struct Student max(struct Student stu[]);
        void print(struct Student stud);
        struct Student stu[3];
        struct Student *p=stu;
        input(p);
        print(max(p));
        getchar();
        getchar();
        return 0;
    }
    
    void input(struct Student stu[])
    {
        int i;
        printf("请依次输入学生编号,姓名,三个科目成绩:\n");
        for (i=0;i<3;i++)
        {
            scanf("%d %s %f %f %f",&stu[i].num, &stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
            stu[i].aver = (stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
        }
    }
    
    struct Student max(struct Student stu[])
    {
        int i,m=0;
        for (i = 0;i<3;i++)
        {
            if(stu[i].aver>stu[m].aver) m = i;
        }
        return stu[m];
    }
    
    void print(struct Student stud)
    {
        printf("成绩最高的学生:\n");
        printf("学号:%d\n 姓名:%s\n 三门成绩:%5.1f,%5.1f,%5.1f\n 平均成绩:%6.2f\n",stud.num,stud.name,stud.score[0],stud.score[1],stud.score[2],stud.aver);
        getchar();
    }

    程序运行结果如下:
    这里写图片描述

    定义一个结构体:

    struct Student
    {int num;
    char name[20];
    float score[3];
    float aver;
    };

    结构体的作用与int double float等一样,都是一种数据类型,只是结构体是将不同类型组合后形成的一个用户自己定义的数据结构

    结构体变量:
    该程序定义了一个结构体数组和一个结构体指针,就像数组和指针的定义一样,需要说明数组和指针的类型,数组就是可以存放什么类型的数据,指针是可以指向什么类型的数据。

    struct Student stu[3];
    struct Student *p=stu;

    用结构体变量和结构体变量的指针做函数的参数:
    定义结构体指针p,并初始化它让他指向结构体数组stu的首地址。

    input函数形参为结构体数组,实参为结构体指针。
    max函数形参为结构体数组,实参为结构体指针。
    print函数形参是结构体变量,实参是结构体变量(是结构体数组元素)。

    展开全文
  • C语言结构体变量

    2021-05-20 13:16:22
    结构体一个或多个变量的集合,这些变量可以是不同的类型,为了处理的方便而将这些变量组织在一个名字之下。比如我要统某个班的学生信息(包括姓名,学号,成绩),每个学生都需要至少3个变量,如若学生人数较多,那...

    结构体是一个或多个变量的集合,这些变量可以是不同的类型,为了处理的方便而将这些变量组织在一个名字之下。比如我要统某个班的学生信息(包括姓名,学号,成绩),每个学生都需要至少3个变量,如若学生人数较多,那需要的变量就非常之多了。为了解决这样的问题,就要用到结构体这种构造类型,我们可以将每个学生的各项信息以不同类型的数据存放到一个结构体中,如用字符型表示姓名,用整型或字符型表示学号、用整型或实型表示成绩。

    b81248522902dedb1b8d417d7291f487.png

    结构体变量的定义

    结构体就是将不同类型的数据组合成一个有机的整体,以便于引用。如定义一个学生的信息:

    struct student{int num;char name[20];int score;};struct为结构体关键字,student就是这结构体的类型名,而 num,name, score就是该结构体的成员,他们可以是不同类型的,注意在定义类型的时候不要对结构体成员num,name, score赋初值。其次就是在大括号后面要有分号“;”。

    定义结构体变量的方式

    定义变量的方式都是大同小异的,都为数据类型+变量名这样一种方式,比如int型,首先得有int这样一个数据类型,然后再用int这个数据类型去定义一个变量,同样的,我们要定义一个结构体变量,必须要有一个结构体类型,然后用这个类型去定义一个变量。结构体变量的定义有多种方式:

    方式一:先定义结构体类型再定义变量名

    67ce5c6fc2757c97bbd763b798fe7880.png

    其中struct是关键字,student是结构体标记(用于为结构体命名),struct student代表该结构体的类型, 大括弧里面就是结构体的成员。注意大括弧的后面一定要有一个分号‘;’。到此为止我们有了"struct student"这样的类型了,struct student就等价于我们的int一样,接下来我们就要定义一个这样类型的变量,定义格式如下:struct student zhangsan; 这个zhangsan就是我们所要的结构体变量。

    方式二:在声明类型的同时定义变量

    如:

    73ce08b516aa780b6c0d9ee6e1abd206.png

    这种方式定义结构体,后续可以根据需要定义新的变量,如struct student Wangwu。 注意:不能用Zhangsan去定义新的变量,这里Zhangsan、Lisi都为变量名而不是结构体类型。

    方式三:直接定义结构体类型变量

    934131e8cb16f3dbae3eef5ab269caf7.png

    这种定义方式中结构体变量只能在定义结构体类型的时候定义,不能再定义其他的变量。这样的定义的结构体类型是没有名字的,我们也可以用typedef重新为这样的结构体类型命,如:

    67f51f5a36c238a0e84e1cb5f75b107c.png

    使用typedef后,我们可以用Zhangsan作为数据类型来定义新的变量。需要注意的是,不能直接使用Zhangsan.num,因为Zhangsan不是变量,而是结构体类型。

    结构体变量的初始化:

    7e02093ac52a9a6f74710418865a1d11.png

    结构体变量的应用:

    结构体中的成员,可以像普通变量那样单独使用,如下面例子中,结构体变量A中的成员num,可以用A.num的方式来使用。

    结构体变量的成员引用:结构体变量名.成员名

    99345b0b983ae0a6767d29d91babc535.png

    关于结构体的一点说明:

    1、不能将结构体变量作为整体进行操作:printf("%d, %d\n", A);错误scanf("%d, %d\n”,&A); //错误printf("%d, %d\n”, A.num, A.score); //正确scanf("%d, %d\n”, &Lucy.num, &Lucy.sex); //正确2、当结构体变量的成员也是结构体类型时,引用必须用最底层的成员变量,如下

    f1d87f289cd12798e3ab5d66414980ca.png

    3、成员名可与程序中的变量名相同,二者代表不同对象

    ad31ad6ad3c15cad6b572dabb93404b4.png

    4、可以引用结构体变量成员的地址,也可以引用结构体变量的地址,例如:scanf("%d", &A.num); //输入A.num的值printf("%d", &A); //输出Bob的首地址目的:主要用作函数参数,传递结构体变量的地址。5、允许具有相同类型的结构变量可以相互赋值,其它情况不允许对结构变量直接赋值。

    0a83a6a05067230d5216940485b52d44.png

    就这么多吧,后续写写结构体数组,结构体指针,共用体,枚举,typedef,最后说一下结构体内存分配相关方面的内容。

    a64636d431e20731bd8c6d6428ad61e5.png

    举报/反馈

    展开全文
  • 2 结构体变量(实例)是具体的,实际的,代表一个具体变量。 二 结构体变量在内存的布局 三 如何声明结构体 1 基本语法 type 结构体名称 struct { field1 type field2 type } 2 举例 type Student ...
  • 9.1 定义和使用结构体变量 9.1.1 自己建立结构体类型 实际生活中,有些数据是有内在联系的,成组出现的。例如,一个学生的学生、姓名、性别、年纪、成绩和家庭地址等项,是属于一个学生的。人们希望把这些数据...
  • 结构体变量是一种复合型变量,每一个结构体变量包含结构体中的所有变量,即是一个变量集合。 #include <stdio.h> /*struct是结构体的标志,books是结构体的名字,book是books结构体的变量 可以定义多个...
  • 在说明一个结构体变量时系统分配给它的存储空间是 B 。 A) 该结构体中第一个成员所需存储空间 B) 该结构体中最后一个成员所需存储空间 C) 该结构体中占用最大存储空间的成员所需存储空间 D) 该结构体中所有成员...
  • 结构体变量和结构体类型的定义

    万次阅读 多人点赞 2019-08-02 16:43:19
    结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *LinkList; 定义方式2: struct LNode { int data; // 数据域 struct LNode *next; // 指针域 }; ...
  • 结构体种数据类型(像int、char、flaot是数据类型一样),可以用它定义变量。用结构体类型定义变量的方式有三种:、先定义结构体类型,再定义变量一般形式:struct 结构体名{类型标识符 成员名;类型标识符 成员...
  • 将不同类型的数据组合成一个有机的整体即为结构体。结构体由许多组织一起的数据项组成,这些数据项不需要属于同一类型。 2、结构体类型及结构体变量定义 (1)结构体类型声明 struct 结构体名 { 成员表列; }; ①–...
  • 结构体变量的初始化和引用

    千次阅读 2021-01-21 18:28:37
    结构体变量的初始化和引用 任务描述 本关任务:从键盘输入两学生的学号,姓名和成绩(整数),分别存入结构体中,输出成绩较高的学生的学号,姓名和成绩。 相关知识 结构体类型用于描述由多不同数据类型的数据...
  • //c语言中,全局定义一个结构体变量报如下错误,但是c++中不会报错, //求解怎么解决?? E0059 常量表达式中不允许函数调用 ![图片说明]...
  • 通过指向结构体变量的指针引用结构体变量中的成员下面通过一个简单例子来说明指向结构体变量的指针变量的应用。【例7.3】指向结构体变量的指针的应用。#include #include using namespace st...
  • 结构体类型定义 结构体是由若干称为成员的成分组成,具有以下特点: 1、每成员具有独立的数据类型; 2、定义结构体时,成员数量必须固定; 3、成员名固定唯一且不可与结构体类型相同。 定义格式: ...
  • 【C语言】结构体变量的初始化方法

    千次阅读 2019-07-07 17:08:03
    结构体变量的初始化方法 1.定义结构体变量并同时对其初始化 这里介绍三种方法: 顺序法 乱序法 C++风格的乱序 struct student { int score; const char *name; } 1.1 顺序法 按照结构体成员的声明顺序进行初始...
  • 解题思路:已有的基础上,本题要解决两问题: 怎样对结构体变量成员赋值; 怎样通过指向结构体变量的指针访问结构体变量中成员。 #include <stdio.h> #include <string.h> struct Student{ long ...
  • 一个结构体变量中的数据传递给另一个函数,有下列3种方法: 用结构体变量名作参数。一般较少用这种方法。用指向结构体变量的指针作实参,将结构体变量的地址传给形参。用结构体变量的引用变量作函数参数。 下面...
  • 【C语言笔记】struct结构体变量的用法

    千次阅读 多人点赞 2020-09-14 09:10:26
    当我们要使用一个变量保存年龄可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩可以将其声明为float。 那么,当我们要做一个学生信息管理系统,需要保存学生的姓名、学号、年龄等信息,该...
  • 前面学习了变量和数组这些简单的数据结构,它们的特点是必须使用规定的数据类型。...结构体类型变量的 定义 和 引用结构体种复合数据类型,它由不同数据类型的存储单元组合。例如,学生的成绩表...
  • 文章目录结构体作为参数或者返回值传递指向结构体变量的指针动态申请结构体构建一个图书馆 传递结构体变量 结构体变量可以相互赋值么 #include<stdio.h> int main() { struct Test { int x; int y; }t1,t2; ...
  • 【问题描述】定义一个结构体变量用以记录一个日期(包括年,月,日)。输入一个日期,计算该日是本年的第几天。 【输入形式】输入日期(包括年 月 日),是三个整数,以空格分隔。 【输出形式】输出该日是本年的第...
  • C指向结构体变量的指针(结构指针变量)

    千次阅读 多人点赞 2018-04-22 17:03:32
    一个指针变量当用来指向一个结构体变量时,称之为结构体指针变量。结构体指针变量中的值是所指向的结构变量的首地址。通过结构指针变量即可访问该结构的变量。结构指针变量说明的一般形式如下:struct 结构名 *结构...
  • 创建结构体变量时指定字段值 说明 Golang 创建结构体实例(变量),可以直接指定字段的值 创建结构体变量时,就直接...创建结构体变量时,把字段名和字段值写一起, 这种写法,就不依赖字段的定义顺序.
  • 结构体指针变量的定义

    千次阅读 2020-04-07 17:57:34
    最近STM的GPIO结构体定义中看到源代码的时候,顺便复习下结构体指针变量的定义及typedef 的使用。 1.结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针...
  • (七)类型限定1.1 类型限定 1.1.1 const const是代表一个不能改变值的常量 1.1.2 volatile 代表变量一个可能被CPU指令之外的地方改 ...C语言中【变量】的存储类型共有4种类型C语言中,对变量的存储类型说明有以下...
  • 要获取结构体变量的首地址,就是要获取结构体变量一个元素的地址。 例如: typedef struct { uint16 Kp; uint16 Ki; uint16 Kd; } spidPID; //定义一个结构体类型 spidPID VarPID={1,2,3}; ...
  • 结构体变量的引用的一些说明

    千次阅读 2018-02-23 21:40:15
    1.不能将整个结构体变量输入后输出,只能对结构体变量中各个成员进行输入和输出。 2.如果成员本身是结构体类型,要级的将最低级的成员。并且只能对最低级的成员进行复制、存取后运算。 如:student1.birthday...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 123,614
精华内容 49,445
关键字:

在说明一个结构体变量时