【C++】结构体

目录

结构体struct的基本形式

变量定义和初始化

读写结构体内部成员

结构体赋值

结构体指针

特殊形式(匿名结构体,但一般不这么用)

另一种特殊形式(一般也不这么用)

对齐问题

结构体作为成员


我对结构体的理解:结构体是将多种数据类型组合成一个集合,这个集合就是结构体。结构体是弱化版的类,功能没有类强大。

结构体注意点:struct一般都放在最外层定义,不放在函数内定义。

不使用结构体(先不谈”类“),会带来以下几个问题:

1)信息比较松散,不直观;

2)容易重名;

3)数据存取不方便。

结构体struct的基本形式

struct TypeName
{
    //Members;
}

其中,struct是关键字,TypeName为新类型的名称,Members则是一系列成员。

1)TypeName的命名规则,和变量名的规则一样;

2)成员变量可以是 普通变量/数组 定义。

变量定义和初始化

结构体的使用方法和普通的int等类型基本相同。

程序功能:展示结构体初始化

C语言中结构体使用:struct Contact a = {100,"nick","123456789",};关键字struct不能漏。

而C++中就不存在这么麻烦的事情。

#include "stdio.h"

struct Contact
{
    int id;
    char name[16];
    char phone[16];
};

int main()
{
    //初始化单个结构体
    Contact a = {100,"nick","123456789",};
    //初始化结构体数组
    Contact b[4] =
    {
        {100,"nick","123456789",},
        {99,"nancy","123456789",},
        {98,"jack","123456789",},
        {97,"rose","123456789",},
    };
    return 0;
}

读写结构体内部成员

程序功能:访问,修改结构体内部数据。(strcpy函数来自于string.h)

#include "stdio.h"
#include "string.h"

struct Contact
{
    int id;
    char name[16];
    char phone[16];
};

int main()
{
    //初始化单个结构体
    Contact a = {100,"nick","123456789",};

    a.id = 201;
    strcpy(a.name, "John");
    strcpy(a.phone, "987654321");

    printf("%d %s %s", a.id, a.name, a.phone);

    return 0;
}
/*
//run out:
201 nick 987654321
*/

结构体赋值

程序功能:赋值操作。

#include "stdio.h"
#include "string.h"

struct Contact
{
    int id;
    char name[16];
    char phone[16];
};

int main()
{
    //初始化单个结构体
    Contact a = {100,"nick","123456789",};

    Contact b = a;

    return 0;
}

结构体指针

程序功能:结构体指针。

指针需要用符号->来访问成员变量,或者使用(*p).id这种方式。

还有如果申明了结构体数组,在访问时p[0].id这样使用,因为p[0]他不是指针了,已经是一个对象了,所以可以直接使用.(点号操作)。

#include "stdio.h"
#include "string.h"

struct Contact
{
    int id;
    char name[16];
    char phone[16];
};

int main()
{
    //初始化单个结构体
    Contact a = {100,"nick","123456789",};

    Contact *p = &a;
    p->id = 3;
    printf("%d %s %s", a.id, a.name, a.phone);

    return 0;
}

/*
//run out:
3 nick 123456789
*/

特殊形式(匿名结构体,但一般不这么用)

struct
{
    int id;
    char name[16];
    char phone[16];
}Info1;

该结构体没有类型名,只有变量名,可以这样定义,但一般不这么用。

另一种特殊形式(一般也不这么用)

struct Contact
{
    int id;
    char name[16];
    char phone[16];
}Info1, Info2;

为什么不这样用?其实很显然,结构体属于类型定义,而类型定义一般会放在头文件中。你在头文件中定义2个变量岂不是很扯。

对齐问题

为什么要对齐?

因为cpu的指令要求,只能在对齐的地址上存取,属于指令集的语法要求。不对齐就没法存取。(并不是所有的CPU都有此限制。)

通常对齐规则:

short:其内存地址必须是2字节对其(地址能被2整除)

int:4字节对齐

对结构体进行padding,使得结构体保持对齐。

程序功能:打印结构体obj的地址。

#include "stdio.h"

struct Object
{
    char a;
    char i;
    int b;
};

int main()
{
    //初始化单个结构体
    Object obj;
    printf("a:%p b:%p \n", &obj.a, &obj.b);

    return 0;
}

结构体作为成员

struct Score
{
    float chinese;
    float english;
    float math;
};
struct Student
{
    int id;
    char name[16];
    Score score;
};

使用指针,不直接包含:

struct Score
{
    float chinese;
    float english;
    float math;
};
struct Student
{
    int id;
    char name[16];
    Score *score;
};
Score _score = {80,79,25};
Student _stu;
_stu.ps = &_score;

为什么需要传地址?

如果你的变量是一个信息量特别多的结构体,如果你传值,会占用cpu和内存资源,而且这是没有必要的。干嘛不直接传地址给它,只要地址给它,只要解析地址就好,那占用资源就非常少,极其高效。

如果只读,那么就加const,变为const Contact*;想读写就不加const,就传递Contact*就行了。

猜你喜欢

转载自blog.csdn.net/u013066730/article/details/84255288