回顾C语言中结构体的使用方法。

结构体定义和初始化

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

struct student {
    int num;
    char name[20];
    char sex;
};  //不要忘记分号

int main(){
    struct student s = {10,"elwood",'m'}; //初始化
    cout << s.num << endl;
    cout << s.name << endl;
    cout<< s.sex << endl;
    return 0;
}
结构体所占用空间不是单个成员所占空间的总和,因为存在对齐,对齐可以提高CPU访问内存的效率。

结构体指针

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

struct student {
    int num;
    char name[20];
    char sex;
};

int main(){
    struct student s = {10,"elwood",'m'};
    struct student* ptr = &s;
    cout << s.num << ' ' << ptr->num << endl;
    cout << s.name << ' ' << ptr->name << endl;
    cout<< s.sex << ' ' << ptr->sex << endl;
    return 0;
}

以上两种输出方法,所得的结果相同。.->都被称为成员选择运算符,其区别在于,.运算符对对象使用,而->对指针使用。

对于结构体s,使用下列方法输出成员的值是错误的:

cout << *ptr.num << endl; //错误

其原因是,.运算符的优先级高于*。因此不能对指针使用.运算符。

如果一定要使用,下列方法是正确的:

cout << (*ptr).num << endl; //正确

typedef关键字

typedef struct student {
    int num;
    char name[20];
    char sex;
} stu, *pstu;

用这种方法定义结构体,声明时的格式有所变化:

stu s = {10, "elwood", 'm'};
pstu ptr = &s;
使用 typedef 的原因是实现代码即注释,方便理解代码

C++引用

#include <iostream>
#include <cstdlib>

using namespace std;

void modifyNum(int &a){
    ++a;
}

void modifyPtr(int *&p){
    p = (int*)malloc(20);
    p[0] = 5;
}

int main(){
    int a = 10;
    modifyNum(a);
    cout << a;
    int *p = nullptr;
    modifyPtr(p);
    return 0;
}