当前位置: 首页 > news >正文

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,即默认结尾会含\0char 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 unusedbool b1: 1;bool b2: 1;
};int main()
{bitTest bt = { 14, true, false };// 结构体会以最大长度对齐,即 SN+填充 占4字节,b1+b2 占4字节cout << sizeof(bt) << endl; // 输出:8return 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
http://www.lryc.cn/news/16630.html

相关文章:

  • 代码随想录算法训练营第七天 | 454.四数相加II 、 383. 赎金信、15. 三数之和、18. 四数之和 、总结
  • apply函数族
  • 读书笔记可读性素材
  • 【C++】vector 模拟实现
  • canvas初体验
  • JavaWeb12-线程通讯(线程等待和唤醒)
  • 江苏专转本如何事半功倍的备考
  • linux下安装mongoDB
  • 掌握MySQL分库分表(七)广播表、绑定表实战,水平分库+分表实现及之后的查询和删除操作
  • 企业为什么需要数据可视化报表
  • 5个有效的华为(HUAWEI)手机数据恢复方法
  • 【Java并发编程】线程安全(一)Synchronized原理
  • [apollo]vue3.x中apollo的使用
  • system()函数启用新进程占有原进程的文件描述符表的问题
  • nignx(安装,正反代理,安装tomcat设置反向代理,ip透传)
  • sklearn模块常用内容解析笔记
  • 我的 System Verilog 学习记录(2)
  • 【调研报告】Monorepo 和 Multirepo 的风格对比及使用示例
  • Retrofit源码分析
  • Mybatis-Plus入门系列(20) -兼容多种数据库
  • JetPack板块—Android X解析
  • C++学习笔记-数字
  • Nginx——Nginx的基础原理
  • 服务端开发Java之备战秋招面试篇1
  • 【C++的OpenCV】第三课-OpenCV图像加载和显示
  • 【面试1v1实景模拟】Spring事务 一文到底
  • Neuron Selectivity Transfer 原理与代码解析
  • vue项目关闭子页面,并更新父页面的数据
  • 第五次作业:修改redis的配置文件使得windows的图形界面客户端可以连接redis服务器
  • 【11】FreeRTOS的延时函数