精华内容
下载资源
问答
  • 结构体的使用

    2015-02-03 10:10:00
    结构体的使用 定义结构体的一般形式: struct 结构名 { 成员表列 }; 结构体定义并不是定义一个变量,而是定义了一种数据类型,这种类型是你定义的,它可以和语言本身所自有的简单数据类型一样使用(如 int )。...
    结构体的使用
    定义结构体的一般形式:

    struct 结构名

    {

    成员表列

    };

    结构体定义并不是定义一个变量,而是定义了一种数据类型,这种类型是你定义的,它可以和语言本身所自有的简单数据类型一样使用(如 int )。结构体本身并不会被作为数据而开辟内存,真正作为数据而在内存中存储的是这种结构体所定义的变量。
    定义结构体以及定义结构体变量的方法:

    一、先定义结构体,再说明结构变量
    struct person
    {
        char name[20];
        int age;
    
    };//这个分号不能忘了  首先是定义了结构体类型
    struct person n1,n2;
    二、在定义结构体的同时说明结构体变量
    struct person
    {
        char name[20];
        int age;
    
    }n1,n2;//struct person n3,n4;//
    
    三、直接说明结构体变量
    struct 
    {
        char name[20];
        int age;
    
    }n1,n2;
    以上的结构体的定义是在c语言的环境中。

    下面讲述下在c++和c语言环境中结构体定义的一些差别

    在C语言环境下,利用typedef定义结构体
    typedef struct Student
    {  
        char name[20];
        int age;
    }Stu;

    //此时相当于给结构体类型 struct Student利用typedef定义了个别名 Stu。Stu student1; 定义了一个student1的结构体类型变量 struct Student student2;这里这样定义一个结构体类型变量也是可以的
    
    
    这里还可以把上面的Student省略掉,如下
    typedef struct 
    {  
        char name[20];
        int age;
    }Stu;//此时定义结构体类型的变量只能 Stu student1; 而不能  struct Student student2;
    
    

    在c++语言环境中,利用typedef定义结构体。
    在介绍c++环境中,利用typedef定义结构体之前,我们看看不用typedef,c++中如何定义结构体
    struct Student
    {  
        char name[20];
        int age;
    };//此时定义了一个结构体类型Student,声明变量只要 Student stu1;
    
    如果上面程序改动如下
    struct Student
    {  
        char name[20];
        int age;
    }stu1;//此时定义了一个结构体变量stu1;

    利用typedef定义结构体
    typedef struct Student
    {  
        char name[20];
        int age;
    }Stu;//Stu是结构体类型而不是结构体变量 Stu stu1;  Stu ==  struct Student



    展开全文
  • 文章目录一、结构体的定义和使用1. 使用typedef的情况2.不使用typedef的情况二、结构体数组三、结构体嵌套结构体 一、结构体的定义和使用 结构体是存储不同类型的数据项 结构体是一种构造数据类型 结构体中的...

    一、结构体的定义和使用

    • 结构体是存储不同类型的数据项

    • 结构体是一种构造数据类型

    • 结构体中的成员空间是独立的

    为了访问结构的成员,我们使用成员访问运算符(.)

    结构体的定义形式:

    1. 使用typedef的情况

    • 格式一:此方法最为标准实用
    typedef struct student
    {
        char name[10];  //姓名
        int num;  //学号
        float score;  //成绩
    }stu;
    
    stu m_stu; //使用方法
    
    • 格式二:省略struct后面的内容
    typedef struct 
    {
        char name[10];  //姓名
        int num;  //学号
        float score;  //成绩
    }stu;
    
    stu m_stu; //使用方法
    
    • 格式三:省略最后分号前的定义
    typedef struct student
    {
        char name[10];  //姓名
        int num;  //学号
        float score;  //成绩
    };
    
    struct student stu;//使用方式
    

    注意:此格式编译器可能会警告,但是能够运行且可以正常读取数据不会发生段错误

    2.不使用typedef的情况

    typedef可以自定义名称,不使用相当于直接操作原生的结构体。

    • 格式一:将typedef去掉,此时stu没有意义,注意使用方式
    struct student
    {
        char name[10];  //姓名
        int num;  //学号
        float score;  //成绩
    }stu;
    
    struct student stu; //使用方法
    
    • 格式二:将typedef去掉,这是直接创建结构体变量的形式,只能使用一次,几乎没有什么用处
    struct 
    {
        char name[10];  //姓名
        int num;  //学号
        float score;  //成绩
    }stu;
    
    • 格式三:将typedef去掉,此种方式是比较标准的
    struct student
    {
        char name[10];  //姓名
        int num;  //学号
        float score;  //成绩
    };
    
    

    二、结构体数组

    每一个数组中存放着结构体,请看下图:

    结构体数组

    struct stu
    {
    	int num;
    	char name[16];
    	int age;
    };
     
    void test()
    {
    	struct stu arr[5] = { {10,"lucy",18},{11,"bob",20},{12,"tom",20} };
    	int n = sizeof(arr) / sizeof(arr[0]);
    	for (size_t i = 0; i < n; i++)
    	{
    		printf("%d %s %d\n", arr[i].num, arr[i].name, arr[i].age);
    	}
    }
    

    三、结构体嵌套结构体

    结构体嵌套结构体

    struct student
    {
    	int num;
    };
    
    struct student_1
    {
        struct student stu;
    	char name[16];
    	int age;
    };
    
    void fun_struct(void)
    {
    	struct student_1 data={{10},"xioaming",20};
    	printf("num=%d,name=%s,age=%d",data.stu.num,data.name,data.age);
    }
    
    展开全文
  • C语言中结构体的使用基本上都是定长的,就如以下这种: typedef struct { int a; int b; char c[100]; double d; }STRU; 但在很多的场景下,结构体的定义成不定长反而更容易解决问题,最典型的就是需要通过...

     1、结构体的定长表示

    C语言中结构体的使用基本上都是定长的,就如以下这种:

    typedef struct
    {
        int a;
        int b;
        char c[100];
        double d;
    }STRU;

    2、结构体的不定长表示 

    2.1、指针形式

    但在很多的场景下,结构体的定义成不定长反而更容易解决问题,最典型的就是需要通过Socket发送一个结构体数据,但是结构体中包含了一个不定长的信息。可以采用以下方式来定义结构体:

    typedef struct
    {
    	int  a;
    	char *b;
    	char *c;
    }STRU;

     对于该种类型的结构体可以采用以下两种方式来申请并分配内存:

    1)、直接分配

    	char b[] = "ahsdggc adgfas";
        char c[] = "asjdhvbaegegfgasdjv";
    
        int len = sizeof(STRU);
        int len_b = strlen(b)+1;    //+1是因为字符串有一个字节存放'\0'
        int len_c = strlen(c)+1;
    
    	STRU *stru = (STRU *)malloc(len + len_b + len_c);
    	memset(stru, 0, len);
    
    	printf("Before - STRU 的地址为:%x \n", stru);
    	printf("Before - STRU_B 的地址为:%x \n", stru->b);
    	printf("Before - STRU_C 的地址为:%x \n", stru->c);
    
    	stru->b = (char *)stru + len;	//重新分配 stru->b 的地址
    	stru->c = stru->b + len_b;		//重新分配 stru->c 的地址
    
    	printf("After - STRU 的地址为:%x \n", stru);
    	printf("After - STRU_B 的地址为:%x \n", stru->b);
    	printf("After - STRU_C 的地址为:%x \n", stru->c);
    
    	strcpy(stru->b, b);				//将 b 的内容复制到 stru->b
    	strcpy(stru->c, c);				//将 c 的内容复制到 stru->c
    	cout << ">>> b: " << stru->b << endl;
    	cout << ">>> c: " << stru->c << endl;

    运行的结果如下所示:

    2)、 间接分配

    还有另外一种分配的方式:

        char b[] = "ahsdggc adgfas";
        char c[] = "asjdhvbaegegfgasdjv";
    
    	int len = sizeof(STRU);
        int len_b = strlen(b)+1;    //+1是因为字符串有一个字节存放'\0'
        int len_c = strlen(c)+1;
    
    	STRU *stru = (STRU *)malloc(len);
    	memset(stru, 0, len);
    
    	char *cb = (char *)calloc(0, len_b);	// 申请 len_b 长的内存并初始化为0
    	memcpy(cb, b, len_b);					// 将 b 的内容复制到 cb 中
    
    	char *cc = (char *)calloc(0, len_c);	// 申请 len_c 长的内存并初始化为0
    	memcpy(cc, c, len_c);					// 将 c 的内容复制到 cc 中
    
    	printf("Before - STRU 的地址为:%x \n", stru);
    	printf("Before - STRU_B 的地址为:%x \n", stru->b);
    	printf("Before - STRU_C 的地址为:%x \n", stru->c);
    	printf("Before - cb 的地址为:%x \n", cb);
    	printf("Before - cc 的地址为:%x \n", cc);
    
    	stru->b = cb;
    	stru->c = cc;
    
    	printf("After - STRU_B 的地址为:%x \n", stru->b);
    	printf("After - STRU_C 的地址为:%x \n", stru->c);
    	printf("After - cb 的地址为:%x \n", cb);
    	printf("After - cc 的地址为:%x \n", cc);
    
    	cout << ">>> b: " << stru->b << endl;
    	cout << ">>> c: " << stru->c << endl;

    下图为验证的结果:

    以上两种方式,一个是在申请结构体的内存时也分配字符串长度的内存;还有一种是先分配结构体的内存,然后再申请结构体长度的内存,然后通过地址赋值的方式使结构体中的元素指向那些内存;

     2.2、空数组方式

    但是还有一种形式的结构体:

    typedef struct
    {
        int a;
        int b;
        char c[0];
    }STRU;

    在上面的定义中,char c[0]定义了一个长度为0的字符串数组,此时,在结构体中实际上只包含了a和b的地址空间,即sizeof(STRU)== 8,

    此时c被当成一个指针,指向了结构体后面的内存地址的起始地址,c = &stru + sizeof(STRU),如下所示:

    struct test3{
    	int a;
    	int b;
    	char c[0];	//不占用结构体的内存地址,此时c指向的就是结构体后面的内存空间的起始地址
    };
    
    test3 t3;
    test3* pt3 = &t3;
    printf("t3 address: %x\n", pt3);
    printf("t3.c address: %x\n", t3.c);
    cout << "sizeof(test3) = " << sizeof(test3) << endl;	//8

     最终输出结果为:

    这样就可以直接将结构体后面的数据当成字符串数组c的内容 ,这种使用方式被称为柔性数组,关于柔性数组的更多内容可以参考:https://www.cnblogs.com/pluviophile/p/7571410.html

    展开全文
  • c语言位结构体的使用

    2018-07-20 17:28:34
    作为嵌入式程序员,位结构体可以说是非常的重要,因为这样可以...//位结构体的使用 #define u8 unsigned char #define u16 unsigned short //位结构体 struct data{ u8 flag1: 1; //占用1位 所有最多表示0或...

    作为嵌入式程序员,位结构体可以说是非常的重要,因为这样可以让你节约大多的内存。

    具体就不介绍了,看看代码应该都能懂了。

    #include "iostream"
    //位结构体的使用
    
    #define u8 unsigned char		
    #define u16 unsigned short
    
    //位结构体
    struct data{
    
    	u8 flag1:	1;		//占用1位 所有最多表示0或1
    	u8 flag2:	2;		//占用2位 所有最多表示0,1,2,3
    	u8 flag3:	5;		//下面以此类推
    }data_s;
    
    //位结构体
    struct data1{
    
    	u16 flag1:	1;
    	u16 flag2:	1;
    	u16 flag3:	6;
    }data_s1;
    
    int main()
    {
    
    	data_s={1,0,5};
    
    	printf("占用内存:%d位\n",sizeof(data_s)*8);
    
    	printf("%d %d %d\n",data_s.flag1,data_s.flag2,data_s.flag3);
    
    	data_s={1,0,5};
    
    	printf("占用内存:%d位\n",sizeof(data_s1)*8);
    
    	printf("%d %d %d\n",data_s.flag1,data_s.flag2,data_s.flag3);
    	
    
    
        printf("hello\n");
        return 0;
    }

    运行结果:

    占用内存:8位
    1 2 5
    占用内存:16位
    1 0 5
    hello
    [Finished in 1.1s]

     

    展开全文
  • Struct结构体的使用结构体的声明struct _Person { char *name; int age; double height; };struct _Person p1; 每次使用结构体的时候都要struct _Person ,比如struct _Person p1={0};sizeof(struct _Person );...
  • IOS开发之结构体的使用

    千次阅读 2016-03-25 19:48:23
    IOS开发之结构体的使用 定义结构体并不是定义一个变量,而是定义了种数据类型。 结构体作用:  结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型。以方便...
  • Qt中自定义结构体的使用

    万次阅读 2019-07-19 16:57:58
    Qt自定义结构体Qt是不认识,下面就直接列出使用方法 第一步 建议把所需的结构体放在一个单独头文件中,防止头文件相互包含,gg,而且还有条件编译头自动生成。直接向工作添加C++头文件。 自己把名字取好就行...
  • 关于结构体的使用

    千次阅读 多人点赞 2017-11-04 09:35:59
    一、结构体的定义 1、结构体:属于一种数据类型,类似于int型、char型数据等,结构体代表将不同变量组成一个整体的类型 2、程序中的定义方法: struct student { char name[]; int id; int age; }; //注意花括弧...
  • 一、定义结构体 type Tfrequency_band_list = class frequency_band_name: string; frequency_band_pic_color: string; frequency_band_pic_Stream: ...二、结构体的使用 //全局变量 var frequ...
  • 内存的初始化及结构体的使用 一、内存的使用 1.1 你创建的内存区域可能是脏的  当我们创建一个内存区域的时候,内存中的数据可能是乱七八糟的(可能是其他代码用过后遗留的数据),如下面一段代码: ...
  • 结构体的使用概述

    2017-11-07 21:16:21
    结构体 为什么会出现结构体;...(结构体是一种数据类型,不是变量)如何使用结构体 例如定义一个 struct Student 类型的结构体,包含学号(id),姓名(name),年龄(age); struct Student {
  • [Ruby]Struct 结构体的使用

    千次阅读 2016-07-29 08:46:50
    Struct 结构体的使用 结构体类。由Struct.new生成该类的子类。在子类中使用new方法就可以生成构造体。构造体子类中定义了构造体成员的访问方法n = Struct.new("N", :name, :age) obj = n.new("hello",6) =》 #, age...
  • 结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体。 结构体除了是一个复合数据之外,还用来做面向对象编程。Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。也就意味着结构体...
  • Golang匿名结构体的使用

    千次阅读 2019-05-23 09:52:29
    结构体 (struct) 将多个不同类型字段集中组成一种复合类型,按声明时字段顺序初始化。 typeuserstruct{ namestring agebyte } user:=user{"Tom",2} 定义匿名结构体时没有type关键字,与其他定义类型变量...
  • 浅谈结构体的使用

    2019-08-07 18:23:09
    结构体的定义 有名结构体 struct studengt { int age; char name[32]; }; 有名结构体可以在结构体外定义,而无名结构体不行 无名结构体 struct { int age; char name[32]; }var; 无名结构体只能在结构体中定...
  • 字符串与结构体的使用 变量的定义 这就是一个求这个字符串和字符数组的字节的简单代码,然而我这个有C语言基础,现在自学C++的小菜鸟却把一个简单定义整错了。图中标记的蓝色部分是多余的,于是编译运行时出错,...
  • C 结构体的使用

    2016-01-09 22:09:10
    一、什么是结构体 * 在第八讲时候已经介绍了C语言中数组,用法跟其他语言差不多。当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组有个特点:内部每一个元素都必须是相同类型数据。 * ...
  • C# 结构体的使用

    2017-01-30 21:49:42
    C#结构体,里面成员默认为...C#结构体,有一个默认无参空构造函数,在声明了有参构造函数后,可以继续使用无参构造函数 struct Date  {  public int year, month, day;  public Date(int y, int m, int d)  {
  • c++结构体的使用

    千次阅读 2017-12-10 09:24:20
    // ConsoleApplication5.cpp : 定义控制台应用程序入口点。 //#include "stdafx.h" #include #include using namespace std;...struct haitao { //定义一个结构体 int a, b; string namee01; string namee
  • c++中结构体的使用

    2019-09-26 11:43:49
    结构体定义: 1 struct Books 2 { 3 char title[50]; 4 char author[50]; 5 char subject[100]; 6 int book_id; 7 } book; View Code 访问结构体成员: 1 #include <iostrea...
  • 全局结构体的使用方法

    千次阅读 2018-12-07 16:19:08
    1. 对于全局结构体定义,首先在Globals.h头文件中构造结构体,用typedef方式,如: typedef struct Parameter { int OK; string No; }PARAM; 2.在Globals.cpp文件中: PARAM*parameter= NULL; // 注意,在...
  • 结构体的概念在软件工程上旧的术语叫 ADT(抽象数据类型:Abstract Data Type) 数据层面,结构体是自定义数据类型,可以理解成是由一系列具有相同或不同类型的数据构成的数据集合。因此结构体也被称之为抽象数据...
  • timeval结构体的使用

    千次阅读 2014-05-09 15:14:50
    今天在在学习过程中遇到一个结构体timeval,不是很了解它用法,现在简单的总结一下: struct timeval {  time_t tv_sec;...其实从结构体的定义不难看出,这个结构体定义了一个时间的表示方法,这个结构体最
  • 让你提前认识软件开发(13):指针及结构体的使用

    千次阅读 多人点赞 2014-04-16 20:34:24
    指针及结构体的使用   【文章摘要】  指针在C语言中占有很重要的地位,同时也是学习C语言的难点所在。结构体属于用户自己建立的数据类型,在实际的软件开发项目中应用很广泛。  本文以实际的例子介绍了C语言中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,330
精华内容 10,932
关键字:

结构体的使用