结构体

真是头大,数据结构用c++语言表示真是太难了!还是用写博客的方式记一下c++方面的知识吧

结构体的定义及操作

定义

1.先定义结构体类型,再定义变量

struct student
{
    int num;
    int score;
};
student student1,student2;
//struct student student1,student2;

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

struct student
{
    int num;
    int score;
}student1,student2;

3.在采用声明类型的同时定义结构体变量时,可以省略结构体名

struct 
{
    int num;
    int score;
}student1,student2;

结构体类型与结构体变量的区别

1.定义结构体类型时不分配存储空间,定义结构体变量会在内存中占连续的一片存储单元
2.可以用sizeof计算一个结构体类型占的存储单元数
...

结构体变量的操作

结构体变量成员的表示:

结构体变量名.成员名

结构体变量初始化

1.一般格式:

结构体名 变量名 = {数据}

例如

#include <iostream>
using namespace std;

struct Person
{
    int score1;
    int score2;
}person1;
int main()
{
    person1 = { 60,70 };
    cout << person1.score1;//60
    system("pause");
    return 0;
}

2.定义结构体类型时进行初始化

#include <iostream>
using namespace std;

struct Person
{
    int score1;
    int score2;
}person1 = { 60,70 };
int main()
{
    cout << person1.score1;//60
    system("pause");
    return 0;
}

结构体数组

如:

struct student
{
    int num;
    int score;
}student[3];

结构体数组名表示该结构体数组内存存储空间的首地址

结构体指针

定义及操作

struct student
{
    int num;
    int score;
}stu,*p; //定义结构体变量stu和结构体指针p

int main()
{
    p = &stu;
    (*p).num = 10;
    cout << stu.num << endl;  //10
    cout << (*p).num << endl;  //10
    cout << p->num << endl;  //10

}

注:

1.p是结构体指针,(p)表示p指向的结构体变量stu,(p).num表示p所指的结构体变量中的成员num

2.结构体成员运算符‘.’优先于指针运算符‘*’,因此不能省略‘()’

3.C++允许用指向运算符‘->’连接指针变量与其所指向的结构体变量的成员:

指向结构体的指针变量->成员名

指向结构体数组元素的指针

struct
{
    int score1;
    int score2;
}person[3],*p;

int main()
{
    p = person; //结构体指针p指向person[0]
    p->score1 = 10;
    cout << person[0].score1 << endl;//10
    p++; //指向下一个结构体元素person[1]
    p->score1 = 20;
    cout << person[1].score1 << endl;//20
}

结构体指针作为函数参数

#include <iostream>
using namespace std;

struct Person
{
    int score1;
    int score2;
};

void hanshu(Person *p)//实参q传递给形参p,利用结构体指针p访问并输出结构体成员
{
    cout << p->score1;
}
int main()
{
    Person persons, *q; 
    q = &persons;
    q->score1 = 10;
    hanshu(q);
    system("pause");
    return 0;
}

typedef()的使用

对一个结构体类型声明一个新名字:

typedef struct  //在struct之前用了关键字typedef,表示是声明新类型名
{
    int month;
    int day;
    int year;  
} TIME; //TIME是新类型名,但不是新类型,也不是结构体变量名

新声明的新类型名TIME代表上面指定的一个结构体类型,这样就可以用TIME定义该结构体变量,如:

TIME birthday;//定义结构体变量birthday
TIME *P //p是指向该结构体类型数据的指针

注意点

(1)用typedef只是对已经存在的类型增加一个类型名,而没有创造一个新的类型。只是增加了一个新名字,可以用该名字定义变量。

(2)可以用typedef声明新类型名。但是不能用来定义变量

C语言与C++的结构体知识差异

1.定义结构体变量不同

struct HE
{
     int a;

};

在C里面实际上数据类型为 (struct HE),所以定义一个结构HE变量都要 带上struct.

struct HE a;   //C语言 结构体变量定义方式

而在C++里面实际上数据类型为HE(主要是因为结构体被当成类对待了),所以定义变量不需要 struct.

HE a; //C++语言 结构体变量定义方式

2.动态分配内存不同

C++:可以使用new与delete运算符,也可以使用C++保留的C语言中动态分配内存的两个函数,malloc()函数和free()函数

C语言:malloc()函数和free()函数;函数被包含在malloc.h里面