C++ Primer Plus 学习笔记(二)—— 复合类型

数组

当我们只是定义了数组,而没有对数组进行初始化时,那数组的值将是未定义的。

在对数组进行初始化时,如果只对数组的一部分进行初始化,编译器会将把其他元素自动设置为0。

#include <iostream>

using namespace std;

int main()
{
    int nums1[3] = { 0 };
    cout << nums1[0] << " " << nums1[1] << " " << nums1[2] << endl;

    int nums2[3];
    cout << nums2[0] << " " << nums2[1] << " " << nums2[2] << endl;

    return 0;
}

输出:

0 0 0
57 0 2037520

字符串

只有以空字符(\0)结尾的char数组才是字符串,这是因为C或C++在处理字符串时是以空字符作为结束标识的。

当初始化一个数组未指定长度时,编译器会对自动计算长度,通常这是一种很糟的做法,但是这种做法对于字符数组初始化为一个字符串的情况下是更安全的,因为字符串常量会隐式地包含结尾符。

#include <iostream>

using namespace std;

int main()
{
    char dog[5] = {'b','e','a','u','x'};
    char cat[5] = {'b','e','a','u','\0'};
    cout << dog << endl;
    cout << cat << endl;

    // char bird[5] = "birds"; //编译报错。"birds"实际长度为6,即默认结尾会含\0
    char fish[] = "fishs";
    cout << fish << endl;

    return 0;
}

输出:

beaux�u
beau
fishs

结构

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。C 语言提供了一种数据结构,称为"位域"或"位段"。所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。

C++也允许指定占用特定位数的结构成员,字段的类型应为整型或枚举,且有以下限制:

  • 一个位域必须存储在同一个字节中,不能跨两个字节
  • 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度
  • 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
#include <iostream>

using namespace std;

struct bitTest {
    unsigned int SN: 4;
    unsigned int: 4; //4 bit unused
    bool b1: 1;
    bool b2: 1;
};

int main()
{
    bitTest bt = { 14, true, false };
    // 结构体会以最大长度对齐,即 SN+填充 占4字节,b1+b2 占4字节
    cout << sizeof(bt) << endl; // 输出:8

    return 0;
}

指针

C++允许将指针和整数相加,加1的结果等于原来的地址值加上指向的对象占用的字节数。

#include <iostream>

using namespace std;

int main()
{
    int nums[3] = { 1, 2, 3 };
    int* np = nums;
    cout << "np=" << np << ", nums=" << nums << ", &nums[0]=" << &nums[0] << endl;
    cout << "np+1=" << ++np << ", value=" << *np << endl; 

    return 0;
}

输出:

np=0x61fe0c, nums=0x61fe0c, &nums[0]=0x61fe0c
np+1=0x61fe10, value=2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值