精华内容
下载资源
问答
  • 本文是关于结构体变量的复制与比较
  • 结构体变量

    2021-08-09 11:08:09
    结构体变量的理解及介绍 一、结构是什么? 结构是由程序员自己设计的数据类型,用于描述一个事物的各项数据,由若干个不同的基础类组成。 设计: struct 结构体名 { 类型1 成员名1; 类型2 成员名2; … }; 定义...

    前言

    对结构体变量的理解及介绍

    一、结构是什么?

    结构是由程序员自己设计的数据类型,用于描述一个事物的各项数据,由若干个不同的基础类组成。
    设计:
    struct 结构体名
    {
    类型1 成员名1;
    类型2 成员名2;

    };

    定义结构变量:
    struct 结构体名 变量名
    注意:在定义结构变量时,struct不能省略

    结构体变量的初始化
    struct 结构体名 变量名={v1,v2,…};
    注意:必须要根据成员设计的顺序初始化

    struct 结构体名 变量名={.成员名1=v1,.成员3=v3,…};
    只初始化某些成员,可以不用按照顺序初始化

    注意:同类型的结构体变量可以直接给结构体变量初始化、赋值
    访问成员:
    结构变量名.成员名
    结构指针->成员名
    结构变量作为形参时:
    由于结构变量字节数都比较大,值传递的效率比较低,因此都传递结构变量的地址。

    二、重定义结构体类型

    1.typedef

    typedef 重定义结构体类型
    typedef struct Data
    {
    char ch[5];
    int num;
    }Data;
    注意:一般结构体变量存放在推内存中

    如何计算结构体的字节数:
    结构体成员的顺序会影响它的总字节数,如果能够在设计结构体时,合理安排成员顺序可以大大节约内存
    内存对齐:
    假定第一个成员是从零地址开始,存储每个成员的地址编号必须满足能被该成员的字节数整除,如果不能整除则填充空白字节
    内存补齐:
    结构体的总字节数,必须是它最大成员的字节数的整数倍,如果不是则在末尾填充空白字节
    在linux32位系统下计算结构体的对齐,补齐如果成员的字节数超过4字节,则按照4字节计算
    #pragma pack(n)设置补齐,对齐的最大字节数,n<=默认4(1,2,4);
    windows系统是按照实际情况计算

    2.union

    联合:
    union
    联合与结构的使用方法基本一致,与结构的区别是所有成员公用一块内存,一个成员的值发生改变,其他成员的值也会发生改变
    联合就是使用少量的内存对应多个标识符,来达到节约内存的目的,现在基本上不用

    联合常考的笔试题:
    union Data
    {
    char ch[5];
    int num;
    };
    总字节数:8
    注意:计算联合的字节数要考虑内存补齐,联合天然是内存对齐

    如何判断操作系统的大小端
    假如十六位进制正数0x01020304存储在以0x0A起始的四个字节内存中:
    高位数据存储在高位地址:小端系统(0x0A:04 03 02 01)
    高位数据存储在低位地址:大端系统(0x0A:01 02 03 04)

    结合联合实现

    个人计算机系统一般都是小端系统、而UNIX服务器和网络设备都是大端系统,本地字节序是小端模式,网络字节序是大端模式

    序列化和反序列化

    3.enum

    枚举:enum
    枚举就是一种数据类型可能出现的所有值全部罗列出来,取一个有意义的名字,除此之外的数据,如果赋值给该枚举变量就是非法的(愿望)
    枚举可以看做是值受限的int类型,但C编译器为了效率不会检查,所以C语言的枚举变量可以当做int型变量使用,一般会直接使用起好名字的枚举成员(锦上添花)
    如果不给成员值,成员是枚举常量,默认从0开始,依此加一,如果某个设置了值,后面的会在该值的基础上逐渐+1

    为什么使用枚举:
    为无意义的数值起一个有意义的名字,提高代码的可读性,并且有相对较高的安全性


    总结

    以上,有错误,还请指正

    展开全文
  • 一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。通过指向结构体...

    一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。

    通过指向结构体变量的指针引用结构体变量中的成员

    下面通过一个简单例子来说明指向结构体变量的指针变量的应用。

    【例7.3】指向结构体变量的指针的应用。

    #include

    #include

    using namespace std;

    int main( )

    {

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

    {

    int num;

    string name;

    char sex;

    float score;

    };

    Student stu;//定义Student类型的变量stu

    Student *p=&stu;//定义p为指向Student类型数据的指针变量并指向stu

    stu.num=10301;//对stu中的成员赋值

    stu.name="Wang Fun";//对string变量可以直接赋值

    stu.sex='f';

    stu.score=89.5;

    cout<

    stu.score<

    cout<

    num<

    return 0;

    }

    程序运行结果如下:

    10301 Wang Fun f 89.5 (通过结构体变量名引用成员)

    10301 Wang Fun f 89.5 (通过指针引用结构体变量中的成员)

    两个cout语句输出的结果是相同的。

    为了使用方便和使之直观,C++提供了指向结构体变量的运算符->,例如p->num表示指针p当前指向的结构体变量中的成员num。

    p->num 和(*p).num等价。

    同样

    p->name等价于(*p).name。

    也就是说,以下3种形式等价:

    结构体变量.成员名。如stu.num。

    (*p).成员名。如(*p).num。

    p->成员名。如p->num。

    “->”称为指向运算符。

    请分析以下几种运算:

    p->n 得到p指向的结构体变量中的成员n的值。

    p->n++ 得到p指向的结构体变量中的成员n的值,用完该值后使它加1。

    ++p->n 得到p指向的结构体变量中的成员n的值,并使之加1,然后再使用它。

    用结构体变量和指向结构体变量的指针构成链表

    链表是一种常见的重要的数据结构。图7.8表示最简单的一种链表(单向链表)的结构。

    2aabdd4ab7c08eee8513e3fe7a369218.png

    图7.8

    链表有一个“头指针”变量,图中以head表示,它存放一个地址。该地址指向一个元素。链表中的每一个元素称为“结点”,每个结点都应包括两个部分:

    一是用户需要用的实际数据,

    二是下一个结点的地址。

    可以看到链表中各元素在内存中的存储单元可以是不连续的。要找某一元素,可以先找到上一个元素,根据它提供的下一元素地址找到下一个元素。

    可以看到,这种链表的数据结构,必须利用结构体变量和指针才能实现。

    可以声明一个结构体类型,包含两种成员,一种是用户需要用的实际数据,另一种是用来存放下一结点地址的指针变量。

    例如,可以设计这样一个结构体类型:

    struct Student

    {

    int num;

    float score;

    Student *next; //next指向Student结构体变量

    };

    其中成员num和score是用户需要用到的数据,相当于图7.8结点中的A, B, C, D。next是指针类型的成员,它指向Student类型数据(就是next所在的结构体类型)。用这种方法就可以建立链表。见图7.9。

    a203a4e80db0d2cb5d745cb0d798fe76.png

    图7.9

    图中每一个结点都属于Student类型,在它的成员next中存放下一个结点的地址,程序设计者不必知道各结点的具体地址,只要保证能将下一个结点的地址放到前一结点的成员next中即可。

    下面通过一个例子来说明如何建立和输出一个简单链表。

    【例7.4】建立一个如图7.9所示的简单链表,它由3个学生数据的结点组成。输出各结点中的数据。

    #define NULL 0

    #include

    using namespace std;

    struct Student

    {

    long num;

    float score;

    struct Student *next;

    };

    int main( )

    {

    Student a,b,c,*head,*p;

    a. num=31001;

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

    b. num=31003;

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

    c. num=31007;

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

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

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

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

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

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

    do

    {

    cout<num<score<

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

    } while (p!=NULL); //输出完c结点后p的值为NULL

    return 0;

    }

    本例是比较简单的,所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表。对各结点既可以通过上一个结点的next指针去访问,也可以直接通过结构体变量名a, b, c去访问。

    动态链表则是指各结点是可以随时插入和删除的,这些结点并没有变量名,只能先找到上一个结点,才能根据它提供的下一结点的地址找到下一个结点。只有提供第一个结点的地址,即头指针head,才能访问整个链表。如同一条铁链一样,一环扣一环,中间是不能断开的。

    建立动态链表,要用到后面介绍的动态分配内存的运算符new和动态撤销内存的运算符delete。

    展开全文
  • 然后根据书上的代码去写发现程序运行不起来,真的是过五关斩六将啊,遇到一个问题解决一个问题,今天解决的问题是在用C语言在顺序表中定位的方法内有关于结构体变量值进行比较的代码,程序就卡到了这里,然后通过...

    现阶段因学习数据结构而在用C语言来写书上的代码,然后根据书上的代码去写发现程序运行不起来,真的是过五关斩六将啊,遇到一个问题解决一个问题,今天解决的问题是在用C语言在顺序表中定位的方法内有关于结构体变量值进行比较的代码,程序就卡到了这里,然后通过上网学习解决了。

    下面这是C语言代码

    通过使用memcmp()这个函数解决的问题。

    //数据定位
    int LocateSeqlist(SeqList L,struct DataType x)
    {
        int i=0;
        //memcmp(&L.data[i],&x,sizeof(DataType); 这个就是进行比较两个结构体变量的代码,
    前两个放都是对应的变量,后面的sizeof是你结构体名字。
        while ((i<L.length) && (memcmp(&L.data[i],&x,sizeof(struct DataType))))
        {
            i++;
        }
        if (i<L.length)
        {
            return i+1;
        }
        else return 0;
        
        
    }

    这个还是通过一篇文章给解决的,他讲的还是挺详细的大家可以去他那里看看具体文章

    展开全文
  • 结构体变量之间的比较和赋值原理

    万次阅读 2018-09-08 09:27:25
    结构体变量之间可以做比较吗?答案肯定是不行的,因为比较符号只作用于基本数据类型。如果是用C++或者Java来编程时遇到结构体变量之间的比较,那还好办直接对操作符重载就可以了。但如果是用C语言来编程遇到它呢?...

    结构体变量之间可以直接赋值我想大家都知道了。但结构体变量之间可以做比较吗?答案肯定是不行的,因为比较符号只作用于基本数据类型。如果是用C++或者Java来编程时遇到结构体变量之间的比较,那还好办直接对操作符重载就可以了。但如果是用C语言来编程遇到它呢?很多人说那可以自己写个函数啊,自己想怎么实现就怎么实现,况且写个结构体变量之间的比较程序又不是什么难事。但我想问的是你遇到的结构体里面的成员才多少个?如果是一个结构体中包含多个结构体(而结构体中又包含了结构体,比如ovs中的key值)还有多个共同体,那请问你还会想要自己写个比较程序吗?我想如果你要写那个比较程序至少得200行左右吧,而且还要考虑共用体。所以如果结构体比较复杂的,我们可以用下面的方法来比较,而不必自己去写个程序。

    C语言虽然没有面向对象那种对符号的重载功能,但它更为霸气:可以直接操作内存。说到这里我想大家都清楚怎么比较结构体变量了。对!就是用内存比较:memcmp()函数;下面只说下memcmp()函数的原型和功能。函数原型:int memcmp(const void *buf1, const void *buf2, unsigned int count);具体实现可以网上搜索下,这里就不贴出来了。函数的实现功能:就是把buf1和buf2所指向的内存数据都强转为 (char)(*buf1)(char)(*buf2)进行比较,直到区分出大小或者比较完count个字节。这样一分析也指出了用memcmp()函数对结构体变量间比较的两个缺陷。

    第一个缺陷:填充字段问题。因为是内存比较,每个字节都要比较,而结构体变量是有填充字节的(即对齐问题)详细的见:面试常见考题:结构体成员在内存中分配与对齐。所以结构体间的填充字节要都相等(最好的方法就是填充字节都设置为0),这样才不影响结构体变量之间的比较。解决方案是:每次声明定义一个结构体变量都用memset()函数让这个变量的所有字段都设置为0(也可以为其他数,但最好为0)。因为memset()函数也是对内存中的每个字节设定值得。

    第二个缺陷:是结构体里面包含字符串不好判断。因为字符串之间没什么大小比较的,当然了,如果化作字符来比较对你所要的结果没影响也是可以的。还有种情况:假设结构体里面有个字符指针,指向网卡名称的。变量a里面的指针指向字符数组eth_a[],而变量b里面的指针指向字符数组eth_b[] ,但是eth_a[]和eth_b[]里面存放的都是同一个网卡名称。那这情况下就是比较不出来了。因为里面涉及到指针问题。

    所以用memcmp()函数来比较2个结构体变量还是要小心点,下面贴个小程序:

    这里写图片描述

    这里我特意为第一个缺陷做了下实验,t1里面的填充字段我全部设置为1,而t2里面的填充字段我都设置为0.其他成员数据都相同。最后用memcmp()函数比较的结果肯定是不相等了。

    结构体变量之间的赋值原理是什么?t1 = t2;把t2的值赋值给了t1,那么是怎么赋值的呢?t1.C = t2.C; t1.I = t2.I; t1.ST = t2.ST;是这样赋值的吗?其实不是的。看第27行和第28行代码:如果是成员间赋值的那么第27行代码就是多余的了,因为t1变量里的每个字节都是1。并且第28行的打印应该还是不相等的(因为填充字段不相等)。但事实却不是这样。第28行代码打印的是相等的,反过来说就是不是单纯的成员间的赋值,而是内存拷贝了。t1 = t2把t2的填充字段和成员字段都赋值给了t1.所以总的来说结构体变量间的赋值实则上是内存拷贝。把填充字段和成员变量都拷贝到新变量中。(可能讲的有点乱,总的来说就是看第28行的打印结果来分析赋值原理。如果相等那么就是把填充字段一起赋值过去了;如果不相等那么就是单纯的结构体成员之间的赋值,不涉及填充字段)下面贴出运行的结果:

    这里写图片描述

    根据打印结果可以知道赋值原理其实就是内存拷贝,把填充字段一起拷贝过去了。

    此文章转载自:https://blog.csdn.net/yuzhihui_no1/article/details/38522999

    展开全文
  • 结构体变量的指针

    2014-03-12 22:53:26
    一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。 1. 通过指向...
  • 所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完释放,这种链表称为静态链表。相反动态链表则是指各结点是可以随时插入和删除的,这些结点并没有变量名,只能先找到上一结点,才能根据它提供...
  • 链接:vector容器中存放结构体变量 vector容器中存放结构体变量有两种方式: 1)存放结构体变量本身 2)存放结构体变量的指针 先介绍第一种方式,存放结构体变量到vector容器中,示例如下: 结构体 struct stu { ...
  • (struct)结构体变量作为函数参数调用的方法小结

    万次阅读 多人点赞 2015-04-29 19:37:38
    结构体变量作为函数参数传递的3种方法 将一个结构体变量中的数据传递给另一个函数,有下列3种方法: 用结构体变量名作参数。一般较少用这种方法。 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。 用...
  • 可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。 通过指向结构体变量的指针引用结构体变量中的成员 下面通过一个简单例子来...
  • 一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。 声明一个...
  • //第一个结构体 typedef struct{ char no[20]; char name[50]; float price; }Book; //第二个结构体 typedef struct{ Book *elem; int length; }SqList; //初始化顺序表 Status InitList(SqList &L...
  • 结构体 数组是用于保存一组相同类型数据的, 而结构体是用于保存一组不同类型数组的 在使用结构体之前必须先定义结构体类型, 因为C语言不知道你的...结构体变量占用存储空间大小 struct Person{ int age; // 4 第
  • 一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组   定义结构体变量的指针: //假设已有一个结构体名为Student struct Student *pStruct // 结构体类型...
  • 操作系统 : CentOS7.3.1611_x64gcc版本 :4.8.5问题描述C语言结构体定义中的变量默认是公有(Public)属性,如果实现成员变量的私有(Private)化?解决方案将结构体的定义放入源码件中实现,头文件只放声明。比如有...
  • 结构体变量指针作为函数参数

    千次阅读 2014-03-28 16:37:02
    结构体变量指针作为函数参数传递的例子,最近因为工作上的需要在处理单片机书如数据的时候需要,要使用结构体变量作为函数的参数进行数值的传递,最网上找了一下,发现介绍这部分的知识不是很多,并且比较杂,很多写...
  • 指向结构体变量的指针 一个结构体变量的指针:该变量所占据内存的起始位置。可以设置一个指针变量来指向一个结构体变量,此时指针变量的值就是该结构体变量的起始位置。 指针也可以用来指向结构体数组中的元素。...
  • 结构体变量的初始化定义时初始化定义之后初始化 结构体白能量的初始化方式有两种,可以在定义的时候或定义之后对结构体变量进行初始化。 定义时初始化 一般情况下我们都是在定义的时候对它进行初始化,因为那样比较...
  • 结构体变量1

    2018-11-15 21:39:20
    同一个结构体类型中的各个成员不可重名,但不同结构体中的成员可以同名,并且结构体中的成员名可以和程序中的其他变量同名。 结构体类型的声明只是明确了该结构的组成状况,编译程序没有分配任何储存空间,只有定义...
  • 结构体变量赋值

    2020-02-22 15:21:51
    结构体内变量赋值暂且分为三种(笔者此时只能想到三种) 1.定义时赋值 2.定义后对变量挨个赋值 3.利用函数进行赋值 赋值时再分为两类 ...1.比较简单,在此不做过多介绍,只是简单贴下代码。 struct student{ ...
  • 结构体变量和结构体类型的定义

    万次阅读 多人点赞 2019-08-02 16:43:19
    结构体类型定义 定义方式1: Typedef struct LNode { int data; // 数据域 struct LNode *next; // 指针域 } *LinkList; 定义方式2: struct LNode { int data; // 数据域 struct LNode *next; // 指针域 }; ...
  • 这篇文章主要介绍了C++中的指针结构体数组以及指向结构体变量的指针的用法,是C++入门学习中的基础知识,需要的朋友可以参考下 C++结构体数组 一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据...
  • C++结构体变量的创建方法

    千次阅读 2020-08-18 08:46:46
    对于结构体变量的创建方法比较不熟悉,特意又重新查阅了资料学习了一下 菜鸟教程,对结构体的讲解特别详细 struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book; 在一般...
  • 在C语言中我们如何去运用结构体变量和结构的变量的指针作为函数的参数呢,其实我们对于结构体的变量是有一定的了解的,他们就是将一个结构体变量的值传递给另外一个函数,那么这种有三种方法,希望大家都能够了解...
  • C语言 | 结构体变量

    2021-04-29 08:41:58
    C语言结构体类型 C语言中允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体。...成员表列也称为域表,每一个成员是结构体中的一个域,成员命名规则与变量名相同。 C语言如何定义结构
  • C语言结构体:从函数返回结构体变量的值 在C语言中,结构体的定义有两种书写方式。 结构体变量的定义: struct student { char name[10], num[10]; int score; }; 此时在主类mian()方法中声明变量时必须要使用 ...
  • 9.1 定义和使用结构体变量 9.1.1 自己建立结构体类型 在实际生活中,有些数据是有内在联系的,成组出现的。例如,一个学生的学生、姓名、性别、年纪、成绩和家庭地址等项,是属于一个学生的。人们希望把这些数据...
  • 5/28 C语言结构体变量

    2019-05-28 23:54:00
    如:struct student 定义一个有关于学生的结构体变量,它可能就包括了姓名,性别,年纪,分数和所在地址,比较全面的一些信息。 {int num; char name[20]; char sex; int age; float scor...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 114,493
精华内容 45,797
关键字:

结构体变量的比较