C++ Primer阅读笔记--数组的使用

2023-11-16

1--理解复杂的数组声明

        阅读复杂数组声明时,建议由内向外阅读;

int *ptrs[10]; // ptrs是一个含有10个整型指针的数组
int &refs[10] = /* ? */; // 错误,不存在引用的数组
int (*Parray)[10] = &arr; // Parray指向一个含有10个整数的数组
int (&arrRef)[10] = arr; // arrRef引用含有一个含有10个整数的数组

*Parray 意味着 Parray 是一个指针;

&arrRef 意味着 arrRef 是一个引用;

int *(&arry)[10] = ptrs; // arry 是数组的引用,该数组含有10个指针;

2--size_t 类型

        当使用数组下标的时候,通常将其定义为 size_t 类型;size_t 是一种机器相关的无符号类型,其足够大能表示内存中任意对象的大小;

3--指针和数组

对数组的元素使用取地址符能得到指向该元素的指针;

在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针;

当使用数组作为一个 auto 变量的初始值时,推断得到的类型是指针而不是数组;

int ia[] = {0, 1, 2, 3}
auto ia2(ia);
ia2 = 42; // 错误, ia2是一个指针
auto ia3(&ia[0]); // ia3 的类型是 int*

当使用 decltype 关键字时上述转换不会发生,decltype(ia) 返回的类型是由10个整数构成的数组;

decltype(ia) ia3 = {0, 1, 2, 3}
ia3[1] = i; // 将 i 的值赋给 ia3 的一个元素

4--标准库函数 begin 和 end

        C++11 新标准引入了两个名为 begin 和 end 的函数,可用于表示数组的首元素指针和尾后指针;

        尾后指针不能进行解引用和递增操作;

int ia[] = {0, 1, 2, 3}
int *beg = begin(ia);  // beg表示ia首元素的指针
int *last = end(ia); // end表示ia最后一个元素的下一个位置的指针(尾后指针)
constexpr size_t sz = 5;
int arr[sz] = {1, 2, 3, 4, 5}
auto n = end(arr) - begin(arr);

        上述代码中,n的值为5,其类型是 ptrdiff_t;

        两个指针相减的结果的类型是ptrdiff_t,其是一种标准库类型,与 size_t 同样定义在 cstddef 头文件中;

5--C风格字符串

        C风格的字符串存放在字符数组中,以空字符结束(‘\0’),即字符串最后一个字符后面还有一个空字符('\0');

        对于C风格的字符串,C语言标准库提供了以下函数用于操作字符串:

strlen(p); // 返回p的长度,空字符不计算在内
strcmp(p1, p2); // 比较p1和p2的相等性
strcat(p1, p2); // 将p2附加到p1之后,返回p1
strcpy(p1, p2); // 将p2拷贝给p1,返回p1

        需要注意的是传入此类函数的指针必须指向以空字符作为结束的数组:

char ca[] = {'A', 'B', 'C'};
cout << strlen(ca) << endl; // 错误,ca没有以空字符结束

6--string对象和C风格字符串

        在 C++ 中,允许使用以空字符结束的字符数组来初始化 string 对象或为 string 对象赋值;但不允许用 string 对象直接初始化指向字符的指针,为了完成该功能需要借助 string提供的 c_str() 成员函数;

        c_str() 函数的返回值是一个C风格的字符串,即函数的返回结果是一个指针,该指针指向一个以空字符结束的字符数组;

string s("Hello World");
char *str = s; // 错误,不能使用 string 对象直接初始化char*;
const char *str = s.c_str(); // 正确

现代的 C++ 程序应尽量使用 vector 和迭代器,避免使用内置数组和指针;

7--多维数组

在 C++ 程序中,多维数组指的是数组的数组;

        使用范围 for 语句处理多维数组:

constexpr size_t rowCnt = 3, colCnt = 4;
int ia[rowCnt][colCnt];
size_t cnt = 0;

for(auto &row : ia) // 外层数组
    for(auto &col : row){ // 内层数组的每一个元素
        col = cnt; // 赋值
        ++cnt;
    }

        使用范围 for 语句处理多维数组时,尽管不涉及写的操作,也需要将外层循环的控制变量声明为引用类型,以避免数组被自动转换成指针:

for(const auto &row : ia)
    for(auto col : row)
        cout << col << endl;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Primer阅读笔记--数组的使用 的相关文章

随机推荐

  • 用户画像统计标签(年龄段,消费周期,常用支付方式)

    年龄段 import bean HBaseMeta import org apache spark SparkContext import org apache spark sql 关联 不仅仅是一个相同的 可以 一个与两个之间 objec
  • 11.6.1:综合技巧练习 - 配置和测试网络

    实验ip分配如下 学习目标 创建 测试并配置整个实验网络 综合运用整套课程中学到的技巧 分析请求网页所涉及的事件 DNS ARP HTTP TCP IP Ethernet HDLC 分析在跟踪到 Web 服务器的路由时所涉及的事件 DNS
  • Nokogiri的使用 抓取csdn博客內容 rails

    Nokogiri 锯 使使用 Ruby 中的 XML 和 HTML 变得轻松而轻松 提供了一个明智的 易于理解的 API 阅读 编写 修改 和 查询 文档 它依赖于 libxml2 CRuby 和 xerces JRuby 等原生解析器 速
  • 光流法( Optical Flow Method)

    在计算机视觉中 光流法即可用于运动目标检测 也可以用于目标跟踪 本文主要介绍光流法在运动目标检测和目标跟踪中的区别与联系 1 光流与光流场 光流的概念最初是由 Gibson 于 1950 年首先提出来的 当人的眼睛观察运动物体时 物体的景象
  • 没有计算机网络地址怎么办,教大家电脑没有ip地址mac地址怎么办

    近日有关于电脑没有ip地址mac地址怎么办的问题受到了很多网友们的关注 大多数网友都想要知道电脑没有ip地址mac地址怎么办的具体情况 那么关于到电脑没有ip地址mac地址怎么办的相关信息 小编也是在网上进行了一系列的信息 那么接下来就由小
  • C#Replace

    在C 的字符串操作过程中 有时候需要替换字符串中的某个子字符串 此时就可以使用到字符串类自带的Replace方法来实现 Replace方法将查找到所有符合被替换的子字符串 然后将之全部替换为目标字符串 Replace方法有2个方法重载实现
  • 奇偶排序,双调排序,双调查找

    奇偶排序 奇偶排序是排序方法的一种 复杂度为O n 2 好处是可以利用处理器的并行 第一遍扫描a i a i 1 i为奇数 如果这两个次序不正确 就交换它们的次序 第二遍扫描偶数 双调排序 所谓双调序列 Bitonic Sequence 是
  • matlab 获取矩阵大小、行数、列数、元素总个数——size()/length()/numel()

    1 size size 获取数组的行数和列数 s size A 当只有一个输出参数时 返回一个行向量 该行向量的第一个元素时数组的行数 第二个元素是数组的列数 r c size A 当有两个输出参数时 size函数将数组的行数返回到第一个输
  • docker容器内开启22 ssh_Docker 添加容器SSH服务

    很多时候我们需要登陆到容器内部操作 此时我们就需要开启容器的SSH支持了 下面的小例子将具体介绍三种分配IP地址的方法 分别是pipworl分配 commit分配 Docker分配等 该系列文章只是本人的学习笔记 文章中的文字描述是 Lin
  • java_MD5加密源码

    package com lt util import java io UnsupportedEncodingException import java security MessageDigest import java security
  • 使用Kinect2作为Oculus游戏应用的输入设备

    注 文章写于2015年8月 眼下VR游戏Demo已经完结 所以把上一次预研的一些经验分享出来 希望对大家有所帮助 背景 初接触Oculus时 从网上下载了一大堆的Demo来体验 可是 操作体验大都比較差 特别是FPS类 这也让我们意识到 对
  • BMP转JPG(法二)RGB数据经过YUV交织

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 源码下载地址 http download csdn net detail chenyujing1234 4441643 编译平台 VS20
  • ORACLE not available如何解决

    出现Oracle不可用可以一般情况下有两种办法解决 1 先关闭数据库 在打开数据库 SQL gt shutdown immediate SQL gt startup open 先用这种方式看看问题解决了没有 如果没有再用第二种办法试试 2
  • svn服务器 系统重装恢复吗,请教一下好不好把svn版本库还原到以前的版本?

    1 Linux系统安装svn服务 yuminstall subversion2 新建一个目录用于存储SVN所有文件 mkdir p cbroot svnserver cbweb3 在上面创建的文件夹中为项目project 1 创建一个版本仓
  • 操作系统 虚拟存储器的概念

    虚拟存储器 程序装入内存时可能会出现如下问题 程序太大 要求的空间超出了内存总容量 有大量作业要求运行 但内存不能容下所有作业 常规存储器管理方式的特征 一次性 要求作业全部装入内存才能运行 驻留性 许多不用或暂时不用的程序占用了大量内存空
  • linux命令strings

    linux命令strings 其man信息如下 strings 1 GNU Development Tools strings 1 NAME strings 显示文件中的可打印字符 总览 SYNOPSIS strings a all f p
  • 二维线段树【模板——给出对应注释】

    闲话少说 直接看注释反而会更容易读懂这段二维线段树的模板 include
  • elasticsearch启动报错:master not discovered yet

    通过命令启动 bin elasticsearch E node name hotnode E cluster name geektime E path data hot data E node attr my node type hot 报
  • 违反 GPL 协议赔偿 50 万,国内首例!

    整理 祝涛 出品 CSDN ID CSDNnews 近日 一起关于GPL版权纠纷案裁判文书公示 在一审中 法院指出GPL 3 0协议是一种民事法律行为 具有合同性质 可认定为授权人与用户间订立的著作权协议 属于我国 合同法 调整的范围 来源
  • C++ Primer阅读笔记--数组的使用

    1 理解复杂的数组声明 阅读复杂数组声明时 建议由内向外阅读 int ptrs 10 ptrs是一个含有10个整型指针的数组 int refs 10 错误 不存在引用的数组 int Parray 10 arr Parray指向一个含有10个