【C++】学习笔记十二——类型组合

类型组合

前面介绍了数组、结构、指针,可以用各种方式组合它们。

先创建一种结构类型:

struct antarctica_years_end
{
    int year;
    //...;
};

可以创建这种类型的变量

antarctica_years_end s01, s02, s03;

然后使用成员运算符访问其成员:

s01.year = 1998;

可以创建指向这种结构的指针

antarctica_years_end * pa = &s02;

将该指针设置为有效地址后,就可以使用间接成员运算符来访问成员:

pa->year = 1999;

可以创建结构数组

antarctica_years_end trio[3];

然后,可以使用成员运算符访问元素的成员:

trio[0].year = 2003;

其中,trio是一个数组,trio[0]是一个结构,而trio[0].year是该结构的一个成员。
由于数组名是一个指针,因此也可以使用间接成员运算符:

(trio+1)->year = 2004;    //与 trio[1].year = 2004; 等价

可以创建指针数组

const antarctica_years_end * arp[3] = {&s01, &s02, &s03};

arp是一个指针数组,arp[1]就是一个指针,可将简介成员运算符应用于它,以访问成员:

cout << arp[1]->year <<endl;

可以创建指向上述数组的指针

const antarctica_years_end ** ppa = arp;

其中arp是一个数组的名称,因此它是第一个元素的地址。但其第一个元素为指针,因此ppa是一个指针,指向一个【指向const antarctica_years_end的指针】。这种声明很容易出错,比如遗漏const,忘记*,搞错顺序或结构类型。
C++11版本的auto为这种声明提供了方便,编译器知道arp的类型,能够正确的推断出ppb的类型:

auto ppb = arp;

如何使用ppa来访问数据呢?由于ppa是一个直线结构指针的指针,因此*ppa是一个结构指针,可将间接成员运算符应用于它:

cout << (*ppa)->year << endl;
cout << (*(ppb+1))->year <<endl;

由于ppa指向arp的第一个元素,因此*ppa为第一个元素,即&s01。所以(*ppa)->year为s01的year成员。第二条语句中,ppb+1指向arp[1],即&s02。注意不要省略括号。

程序4.23验证了上述说法。

程序4.23

#include<iostream>

struct antarctica_years_end
{
    int year;
    //...;
};

int main()
{
    using namespace std;
    antarctica_years_end s01, s02, s03;
    s01.year = 1998;
    antarctica_years_end * pa = &s02;
    pa->year = 1999;
    antarctica_years_end trio[3];
    trio[0].year = 2003;
    cout <<trio->year << endl;
    const antarctica_years_end * arp[3] = { &s01, &s02, &s03 };
    cout << arp[1]->year << endl;
    const antarctica_years_end ** ppa = arp;
    auto ppb = arp;
    cout << (*ppa)->year << endl;
    cout << (*(ppb + 1))->year << endl;
    cin.get();
    return 0;
}

这里写图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值