【C++Primer学习笔记】第4章 数组和指针

C++primer plus和C++ primer的读书心得 C++两本巨著primer plus和primer太过于经典,以至于读过多次,每次阅读仍然有新的收获,所以将一些零碎的知识点整理在这里,与大家共同进步。 1.i++与++i的效率比较: 前缀效率高,后缀在递增前需要一个副本。 ... 阅读详情

1、现代C++程序中应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。

 

2、与vector类型相比,数组的显著缺陷在于:数组的长度是固定的,而且程序员无法知道一个给定数组的长度。数组没有获取其容器大小的size操作,也不提供push_back操作在其中自动添加元素。如果需要更改数组的长度,程序员只能创建一个更大的新数组,然后把原数组的所有元素复制到新数组空间中去。

 

3、数组的维数必须用值大于等于1的常量表达式定义。

      常量表达式包括:

1)整型字面值常量。

2)枚举常量

3)用常量表达式初始化的整型const对象

 

4、在函数体外定义的内置数组,其元素初始化为0;在函数体内定义的内置数组,其元素无初始化。

 

5、显示初始化的数组不需要指定数组的维数值,例如:

int ia[] = {0, 1, 2};

 

6、字符数组既可以用一组由花括号括起来、逗号隔开的字符字面值进行初始化,也可以用一个字符串字面值进行初始化。但,使用字符串字面值会包含一个额外的空字符(null)用于结束字符串。

 

7、与vector不同,一个数组不能用另外一个数组初始化,也不能将一个数组的值赋给另一个数组。

 

8、程序员在使用数组时,必须保证其下标值在正确范围之内,即数组在该下标位置对应一个元素。除了程序员自己注意细节,并彻底测试自己的程序之外,没有别的办法可以防止数组越界。

 

9、指针用于指向对象,它存放了对象的地址。

 

10、很多运行时错误都源于使用了未初始化的指针。如果可能的话,除非所指向的对象已经存在,否则不要先定义指针,这样可以避免定义一个未初始化的指针。如果必须分开定义指针和其所指向的对象,则将指针初始化为0。因为编译器可检测出0值的指针,程序可判断该指针并未指向一个对象。

 

11、对指针进行初始化或赋值只能使用一下四种类型的值:

1)0值常量表达式

2)类型匹配的对象的地址

3)另一个对象之后的下一个地址

4)同类型的另一个有效地址

 

12、把int型变量赋给指针是非法的,尽管此int型变量的值可能为0。但允许把数值0或者编译时可获得0值得const量赋给指针。

 

13、void*指针,它可以保存任何类型对象的地址。但只支持以下几种操作:

1)与另一个指针进行比较

2)向函数传递void*指针或从函数返回void*指针

3)给另一个void*指针赋值

 

14、不允许使用void*指针操纵它所指向的对象。

 

15、指针与引用

1)共同点:它们都可以间接访问另一个值

2)差异:引用总是指向某个对象,定义引用时没有初始化是错误的。给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。引用一经初始化,就始终指向同一个特定的对象。

 

16、指针的算术操作只有在原指针和计算出来的新指针指向同一个数组的元素,或指向该数组存储空间的下一个单元时才是合法的。

 

17、两个指针减法操作的结果是标准库类型 ptrdiff_t 的数据。与 size_t类型一样, ptrdiff_t 也是一种与机器相关的类型,在 cstddf 头文件中定义。size_t 类型是 unsigned 类型,而 ptrdiff_t 是 signed 整型。

 

18、指向const对象的指针与const指针

1)const int *A;//const修饰指向的对象,A可变,A指向的对象不可变
2
)int const *A; //const修饰指向的对象,A可变,A指向的对象不可变
3
)int *const A; //const修饰指针A, A不可变,A指向的对象可变
4
)const int *const A;//指针A和A指向的对象都不可变

 

19、不能使用void*指针保存const对象的指针,必须使用const void*类型的指针保存const对象的指针。

 

20、指针与typedef。

typedef string *pstring;

const pstring cstr;

等于

string *const cstr;

 

21、 C风格字符串既不能确切地归结为C语言的类型,也不能归结为C++语言的类型,而是以空字符null结束的字符数组。

char ca1[]={'C', '+', '+'};    // no null, not C-style string

char ca2[]={'C', '+', '+', '\0'};     // explicit null

char ca3[]="C++";           // null terminator addedautomatically

const char *cp="C++";   // null terminator added automatically

char *cp1=ca1;      //points to first element of a array, but not C-style string

char *cp2=ca2;      //points to first element of a null-terminated char array

 

C++语言通过(const)char*类型的指针来操作C风格字符串。

 

22、C风格字符串的标准库函数。C++语言通过(const)char*类型的指针来操作C风格字符串。

strlen(s)                    // 返回s的长度,不包括字符串结束符null

strcmp(s1, s2)          //当s1<s2时,返回值<0 ,当s1=s2时,返回值=0,当s1>s2时,返回值>0 

strcat(s1, s2)            // 将字符串s2连接到s1后,并返回s1 

strcpy(s1, s2)           // 将s2复制给s1,并返回s1

strncat(s1, s2, n)     // 将s2的前n个字符连接到s1后面,并返回s1

strncpy(s1, s2, n)    // 将s2的前n个字符复制给s1,并返回s1

 

23、在使用处理C风格字符串的标准库函数时,牢记字符串必须以结束字符null结束。

 

24、传递给标准库函数strcat和strcpy的第一个实参数组必须具有足够大的空间存放新生成的字符串。

 

25、如果必须使用C风格字符串,则使用标准库函数strncat 和 strncpy 比 strcat和 strcpy 函数更安全,因为前者可以适当控制复制字符的个数。特别是在复制和串联字符串时,一定要时刻记住算上结束符null。

 

26、尽可能使用标准库类型 string,除了增强安全性外,效率也提高了,因此应该尽量避免使用C风格字符串。

 

27、整型类型的变量有三个重要的限制:

1)数组长度固定不变

2)在编译时必须知道其长度

3)数组只在定义它的快语句内存在

 

28、每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或堆(heap)。C语言程序使用一堆标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达式来实现其功能。例如:

int *pia = new int[10];

delete [] pia;

 

29、动态分配数组的初始化

1)如果数组元素具有类类型,将使用该类的默认构造函数实现初始化

2)如果数组元素是内置类型,则无初始化,但可以在后面加圆括号,进行初始化,例如 int *pia = new int[10];(把数组元素都设置为0)。

 

30、如果动态分配内置类型的const对象数组,必须初始化。如果是类类型,必须提供默认构造函数。

 

31、动态分配时允许分配空数组。

 

32、可以使用C风格字符串对string对象进行初始化或赋值,却无法使用string对象初始化字符指针。但我们可以通过string类的c_str成员函数来实现:

string str2("hello");

char *str = st2.c_str();

 

33、c_str 返回的数组并不保证一定是有效的,接下在对st2的操作有可能会改变str2的值,使刚才返回的数组失效。如果程序需要持续访问该数据,则应该复制 c_str 函数返回的数组。

 

34、C++允许使用数组初始化vector对象,但此时必须指出用于初始化式的第一个元素以及数组最后一个元素的下一个位置地址:

const size_t arr_size = 6;

int int_arr[arr_size] = {0, 1, 2, 3, 4, 5};

vector<int> ivec(int_arr, int_arr+arr_size);

 

35、严格地说,C++中没有多维数组,通常所指的多维数组其实就是数组的数组。

 

36、指针数组和指向数组的指针

1)int*ip[4];      // array of pointers to int

2)int(*ip)[4];   // pointer to array of 4 ints

 

37、用 typedef 简化指向多维数组的指针

int ia[3][4];

typedef int int_array[4];

int_array  *ip = ia;

输出ia的元素:

for(int_array *p = ia; p!=ia+3; p++)

for(int *q = *p; q!= *p+4; q++)

cout<<*q<<endl;

C++ Primer 第4版全面学习笔记总结 C++,作为一门集面向对象编程、泛型编程和低级操作于一体的语言,是许多IT专业人士编程生涯的开端。掌握其基础语法是迈出成功的第一步。指针是C++中的一个基本概念,它存储了一个变量的内存地址。指针的声明需要使用星号(*)来标识,例如:int *ptr;// ptr是一个指向int类型的指针在声明指针时,可以同时进行初始化,将它指向一个已存在的变量的地址:// ptr现在指向value的地址函数是执行特定任务的一段代码,它有助于实现代码的模块化,使得复杂程序易于管理和理解。 阅读详情

相关推荐

LabVIEW新手必看:5分钟搞定S7-1200 OPC通信(附完整配置截图)

本文详细介绍了LabVIEW与西门子S7-1200 PLC通过OPC通信实现工业监控系统的完整配置流程。从环境准备、PLC数据块配置到OPC Server高级设置,逐步指导新手快速建立稳定通信链路,并分享工业级应用的优化技巧和异常处理方案,帮助用户提升自动化系统集成效率。

rl6adventurer的博客 640

C /C++标准库 - <cstddef> (stddef.h)

1. 概述stddef.h定义了一些标准宏以及类型,是C语言标准所必须的一部分。2. 定义2.1 Types 序号 标记 原型 说明 1 ptrdiff_t 两个指针相减的结果的有符号整数类型 2 size_t 无符号整数类型,对数组下标或地址算数操作时使用 3 wchar_t c++已作为基本类型,不再任何头文件定义 宽字节字符类型

鲲鹏望舒 8867

IATF16949核心职位全解析

TM / Top MgmtMR / QMRProcess OwnerQMQAQCSQECQEPQEPETEMEIEPM / PJMFMEA ModeratorMSA CoordinatorSPC CoordinatorCM / CCB内审员CP / CPK

weixin_49938552的博客 972

C++ Primer 学习笔记——第4章 数组和指针

C++ Primer 学习笔记—— 第4章 数组和指针 数组和Vector的区别是:数组的长度是固定的,也就是说Vector的长度是可变的.这就是为什么objC有Array和MutableArray,即数组和可变数组一说.可见,可变数组是对c中数组的扩展. 数组和Vec

735

【图形学】后处理下的HDR、颜色分级、颜色映射与颜色空间

目录 一、Color Grading 1.1概念 1.2 内置在Unity/UE4 二、HDR、LDR与VDR 2.1 LDR 2.2 HDR 2.3 VDR 三、Tone Mapping 3.1 概念 3.2 算法发展史 3.3 ACES算法 四、常见的颜色空间标准 参考 一、Color Grading 1.1概念 Color Grading(颜色分级、颜色校正)俗称调色,是游戏后期处理中最常见也是必要的一个环节。它能够改变或矫正最终图像的颜色和亮度,你可以把它想象...

ColorGalaxy 8417

关于“为爱发电”的一些说明~~

专栏教学资料+工程文件

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 2671

c++ primer plus学习笔记_第04章_复合类型

数组, 结构, 指针, 是c++的3种复合类型.数组: 在一个数据对象中存储多个同种类型的值, 使用索引或下标可以访问数组各元素.结构: 在一个数据对象中存储多个不同类型的值, 使用成员关系运算符(.)访问成员.共用体: 可以存储一个值, 但这个值可以是不同类型.指针: 一个变量, 用来存储地址. 对指针使用"解除引用运算符", 将得到指向的位置中的值.字符串: 以空字符结尾的一系列字符. string支持使用赋值运算符来复制字符串(char数组需要使用strcpy())

编程驴子的博客 970

CloudCompare 二次开发(35)——提取多条直线

使用CloudCompare与PCL编程实现的多条空间直线的提取。

点云侠的博客 436

《C++ Primer》学习笔记(三):字符串、向量和数组

专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.youkuaiyun.com/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 文章目录专栏C++学习笔记字符串、向量和数组命名空间的using声明(Namespace us...

种树最好的时间是10年前,其次是现在!!! 5529

LeRobot 官方论文:一个用于端到端机器人学习的开源库

本文介绍了一个名为LeRobot的开源库,旨在解决机器人学习领域的碎片化问题。该库提供了端到端的技术栈,包括统一的机器人中间件API、标准化的数据集格式(LeRobotDataset)、优化的推理栈以及多种最先进机器人学习算法的实现。LeRobot支持多种低成本开源机器人平台(如SO-10X、ALOHA-2等),通过共享中间件实现便捷的遥操作和数据收集。其数据集格式已广泛应用于社区,截至2025年9月已有16,000多个数据集公开共享。该库还支持流式处理大规模数据,降低了研究门槛。在模型方面,LeRobot

2506_90492529的博客 901

iOS远程真机之ios-minicap安装使用完全指南

minicap 是开源项目 STF 中的高速截图工具。STF利用此工具不断的传输图片信息并在web端绘制实现 以前只有Android版本,最近有新的ios版本,现在就安装过程中遇到的一些问题进行分享(ps:感谢sorccu 在issue里面给我的指点) 首先上地址:https://github.com/openstf/ios-minicap 你可以git clone或者直接下载zip包。

甫式人生 1万+

青龙面板 + QLScriptPublic 指南:如何 5 分钟部署一套 100+ 的自动化签到脚本

早上九点的电梯里、通勤地铁上、午休的工位前——你大概也有过这样的时刻:手机里躺着一二十个 App 和小程序,每个都藏着"每日签到""积分任务""浏览赚金币",手动点一遍少说十几分钟,隔天再点又是一遍,漏一天还断了连续签到。QLScriptPublic 配合青龙面板做的,就是把这类重复劳动交给脚本定时执行:你只负责把账号信息填一次,剩下的交给 cron。这个仓库目前收拢了 100 多个可用脚本,覆盖

gitblog_00937的博客 915

【深度学习新浪潮】李飞飞团队VAGEN框架深度解析:让VLM智能体学会“三思而后行“

VAGEN框架的真正价值,不仅在于性能指标的突破,更在于重新定义了VLM智能体的发展方向——人工智能的进步不应只追求"做得对",更要实现"想得清"。李飞飞团队通过强制显式思考、动态表示适配和精细化奖励三大创新,让智能体第一次具备了可解释的世界建模能力。正如人类通过"观察-预测-行动"认识世界,VAGEN为AI注入的这种思考范式,或许正是通往通用人工智能的关键一步。对于开发者而言,开源的VAGEN框架不仅提供了强大的工具,更揭示了一个重要理念:让AI学会思考,比让它学会执行更重要。

专注:太空算力、AI infra、异构调度、大模型成本工程 280

《C++ Primer》习题参考答案:第3章 - 字符串、向量和数组

专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.youkuaiyun.com/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》学习笔记(三):字符串、向量和数组 第三章 字符串、向量和数组 练...

种树最好的时间是10年前,其次是现在!!! 4461

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Node-RED 数据处理实战手册:JSON、XML、CSV 的互转与排错

Node-RED 的数据处理,主要靠核心解析器里的一组节点完成:JSON、XML、CSV(还有 HTML、YAML),它们能把 msg 里的字符串、对象和表格数据互相转换。这篇文章不按"技巧清单"罗列,而是跟着一条数据在流程里走完全程:怎么从字符串变成对象,怎么在 XML 和 CSV 之间互转,字段对不上或坏消息出现时怎么办,最后再看怎么提速。 ## 数据入口:三步把 JSON 字符串解析成对象

gitblog_00964的博客 1058

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【c++ primer 笔记】 第2章 变量和基本类型

概述 c ++定义了几种基本的内置类型(如字符、整型、浮点数等),同时提供自动以数据类型的机制。基本内置类型包括算数类型和空类型。算数类型包括字符、整型数、浮点数和布尔值。类型选择概述几种类型转换:取模与取余区别: 含有无符号的整数整型和浮点型字面值 浮点型字面值可以用小数或科学计数法表示,科学计数法中的指数部分用 E 或 e 标识。 字符和字符串字面值 转义序列布尔字面值和指针字面值 🍮2.2 变量 变量 :提供一个具名的、可供程序操作的存储空间 对象 :一块能存储数据并具有某种类型的内存 初始化对.

小呆鸟blog 2209

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

GetQzonehistory:把十年QQ空间历史说说完整导出,Excel和网页一次拿全

GetQzonehistory 是一个本地运行的 Python 小工具,用来把你 QQ 空间发过的历史说说完整抓取下来,导出成 Excel 表格和一个还原空间样式的网页文件,长期存在自己的硬盘里。适合说说发得多、想把这些旧记录完整存档的人。 ## 先说结果:跑完之后你会得到什么 程序跑完后会自动打开 `resource/result/你的QQ号/` 这个文件夹,里面是一套完整的东西: | 产

gitblog_00301的博客 631

C++ Primer 第3章 字符串、向量和数组

C++ Primer 第3章 字符串、向量和数组C Primer 第3章 字符串向量和数组

iBlue.tech 412

c++ primer plus学习笔记_第10章 对象和类

{};//构造函数原型//构造函数定义//注意co是参数名, compary是成员名, 它们不能相同, 解决方法1) 成员名加m_前缀, 2) 成员名加_后缀....

编程驴子的博客 595

C++ Primer:第3章 字符串、向量和数组

C++ Primer:第3章总结第3章 字符串、向量和数组3.1 命名空间的using声明3.2 标准库类型string3.3 标准库类型vector3.4 迭代器介绍3.5 数组3.6 多维数组 第3章 字符串、向量和数组 3.1 命名空间的using声明 基本内容: 作用域操作符(::):编译器从操作符左侧名字所示的作用域中寻找右侧名字。 using声明(using namespace::n...

北冥有鱼wyh的博客 293

Cpp-Primer-5th-Exercises项目揭秘:从基础语法到高级特性的完整路径

你是否正在学习C++编程语言,却被《C++ Primer》第五版中的复杂习题困扰?😅 别担心,Cpp-Primer-5th-Exercises项目为你提供了完整的习题解答指南!这个开源项目包含了《C++ Primer》第五版所有章节的习题解答,从基础语法到高级特性,为你搭建了一条清晰的学习路径。无论你是C++初学者还是希望巩固知识的开发者,这个项目都是你学习路上的得力助手。 ## 📚 项目概

gitblog_00578的博客 845

C++ Primer 动态数组

专栏简介:本专栏主要面向C++初学者,解释C++的一些基本概念和基础语言特性,涉及C++标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级程序设计技术。希望对读者有帮助!

专注于C/C++编程语言的博客,如果读者对C/C++语言有任何需要咨询的可以私信联系! 1036

C++动态分配指针数组

C++ Primer 4.34练习要求将存在vector<string>中的string取出,存入另外的字符数组中,并用一个字符指针数组存放每个字符数组的首地址。 动态分配一个字符数组不难,用 char *ptr = new char[N]; 就可以了,但是如果想分配一个字符指针数组(一个数组,里面的每个元素存放着指向其他字符数组的指针),就稍稍需要改变一下。 先把这道习题我做...

weixin_30664051的博客 1331

《C++ Primer 4 Answer Book》 整理[4]——第4章 数组指针

<!-- @font-face {font-family:SimSun} @font-face {font-family:SimSun} p.MsoNormal, li.MsoNormal, div.MsoNormal {margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-

我的读书笔记(2011-2013) 703

c++ primer 第4章 数组和指针

避免使用未初始化的指针对指针进行初始化或赋值只能使用以下四种类型的值:   0值常量表达式,例如,在编译时可获得0值的整型const对象或字面值常量0.类型匹配的对象的地址。另一对象末的下一地址。同类型的另一个有效指针。                                把int型变量赋给指针是非法的,尽管int型变量的值可能为0.但允许把数值0或在编译时可获得0值

tt1075882990的博客 432
上一篇: 混合像元分解研究综述——线性混合像元分解算法
下一篇: 5月24日 – 6月11日 CUDA编程学习笔记
jimye
博客等级 码龄17年 260粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值