c++ primer 4 数组和指针
类比的思想学习数组和指针,c++提供类似于vector和迭代器的低级复合类型——数组和指针。与vector相似,数组可以保存某一种类型的一组对象;而他们的区别在于,数组的长度固定,数组一经创建就不允许添加新元素。指针则可以像迭代器一样用于遍历和检查数组中的元素
C++应尽量使用vector和迭代器类型,避免使用低级的数组和指针。设计良好的程序只有在抢到速度时才在类实现的内部使用数组和指针
4.1 数组
定义和初始化
数组的位数必须用值大于等于1的常量表达式定义,非const变量以及要到运行阶段才知道其值的const变量不能用于定义数组的维数
- 在函数体外定义的内置数组,其元素初始化为0;
- 在函数体内定义的内置数组,其元素无初始化;
- 不管数组在哪定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化;如果该类没有默认构造函数,则需要提供显示初始化
显示初始化的数组不需要指定数组的维数值,编译器会根据列出的元素个数来确定数组的长度
int a[] = {1,2,3};
不允许数组直接复制或赋值,数组一经定义就不允许再添加新元素
在用下标访问元素时,vector使用vector::size_type作为下标类型,而数组下标的正确类型则是size_t
字符数组
char ca1[] = {'a', 'b', 'c', '\0'} ; // 一个C风格的字符串,等价于 char ca2[] = "abc" 二者的字符数组大小都是4
char ca2 = "abc";
要注意:虽然char ca2[] = "abc" 内容只有三个字符,由于这种定义是C风格字符串的定义法所以系统会自动在对应的字符数组后面加上 '\0'
4.2 指针的引入
避免使用未初始化的指针 int *cur ; // 定义了一个未初始针未初始化指针值是个随机数
对指针进行初始化或赋值只能是一下四种类型的值:
1 0值常量表达式,如在编译时可获得0值的整型const对象或字面值常量0(表示该指针没有指向任何对象,不应对其有任何操作)
2 类型匹配的对象的地址
3 另一对象之后的下一地址
4 同类型的另一个有效指针
void * 可以保存任何类型对象的地址,但不允许使用void *指针操纵它所指向的对象
有一类指针可以指向另外的指针,也就是指向指针的指针定义如下:
int a = 123 ;
int *cur = &a ;
int **curr = &cur ; 这类指针需要做两次解引(**curr)才能获取真正的对象值。
指针和数组
在表达式中使用数组名,该名字会自动转换为指向数组第一个元素的指针(但数组名不是指针,只是一个符号,见数组与指针)
在指针上加上或减去一个整数值n等效于获得一个新指针,该新指针指向指针原来指向的元素之后(或之前)的第n个元素
用下标访问指针:
int a[] = {,,,,};
int *p = &a[];
cout<<p[]<<endl; //print 4
cout<<p[-]<<endl; //print 1
超出末端的指针不能进行解引用,只能用来和其他指针比较(同迭代器中的.end())
指针和const限定符(重点)
const限定符既可以放在类型前,也可以放在类型后:
string const s; 等价于 const string s;
const对指针的修饰,有两种,指向const对象的指针和const指针
指向const对象的指针:
一般用在函数形参确保传递给函数的实际对象在函数中不被修改
指针指向const对象,则不允许用指针来改变其所指的const值。为了保证这个特性,c++语言强制要求指向const对象的指针也必须有const特性
不能把一个const对象的地址赋给一个普通的、非const对象的指针
允许把const对象的地址赋给指向const对象的指针,但不能通过解引用指针修改非const对象的值
const int a = ;
const int b = ;
int c = ;
const int *p = &a; //valid
p = &c; //invalid
p = &b; //valid
*p = ; //invalid
const指针:
const指针本身的值不能修改,指针指向的值能否修改完全取决于该对象的类型
做好以下习题可理解
答案:4.19 不合法 bcd 都未初始化错误 const类型必须定义初始化,const指针也是
4.20 d不合法,不能用const对象赋给一个非指向const对象的指针
4.21 cef不合法
4.3 c风格字符串
推荐用C++ string类
以空字符null结束的字符数组
char a[]{'a','b','c','\0'} ; // 第一种数组定义语法
char a[] = “abc” ; // 第2种数组定义语法
char *a = “abc” ; // 指针表示法
cout<<*a; 输出a cout<<a; 输出abc
c风格字符串标准库
#include<cstring>
创建动态数组
new数组返回值是第一个元素的指针
int *p = new int[n];
delete [] p;
4.4 多维数组
多维数组就是数组的数组
c++ primer 4 数组和指针的更多相关文章
- Primer回顾 数组和指针
数组和指针类似于vector和迭代器. 区别在于:数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以像迭代器一样用于遍历和检查数组中的元素. 设计良好的程序只有在强调速度时才在类实现的 ...
- 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...
- 【C语言学习】《C Primer Plus》第10章 数组和指针
学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0 ...
- C++ Primer 随笔 Chapter 4 数组和指针
1.数组:数组是由类型名.标识符和维数组成的符合数据类型,类型名规定了存放在数组中的元素类型,维数规定数组中包含元素的个数而标识符就是数组的名称.例如: int arr[10]; 其中 int 是类 ...
- C Primer Plus 第10章 数组和指针 编程练习
这章感觉好难啊,放个别人的总结. // 多维数组和指针 #include <stdio.h> int main(void) { int zippo[4][2] = {{2, 4}, {6, ...
- C Primer Plus学习笔记(九)- 数组和指针
数组 数组由数据类型相同的同一系列元素组成 需要使用数组时,通过声明数组告诉编译器数组中内含多少元素和这些元素的类型 普通变量可以使用的类型,数组元素都可以用 float candy[365]; // ...
- C++ Primer高速入门之六:数组和指针
更新:勘误,delete [] 猪 我们知道,C语言以及早期的面向结构的语言差点儿都支持数组定义.比方整形数组int 女神[2].表示有俩数: 女神[0], 女神[1].她们都是整数. C++ 语言为 ...
- C++数组和指针
<C++ Primer 4th>读书摘要 与 vector 类型相似,数组也可以保存某种类型的一组对象:而它们的区别在于,数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以 ...
- 深入解析C语言数组和指针
概述 指针是C语言的重点,同时也是让初学者认为最难理解的部分.有人说它是C语言的灵魂,只有深入理解指针才能说理解了C语言.暂且撇开这些观点不谈.这章是我在阅读<C和指针>这本书的读书笔记. ...
随机推荐
- ROS中的CMakeLists.txt (转)
在ROS的编程过程中,如果CMakeLists.txt如果写不好,编译就很难成功.如果看不懂CMakeLists.txt那么很多错误你也不知道时什么回事.所以深入了解它是很右必要的.现在我们就来看看它 ...
- 7.Configurator API 详细介绍
一.Configurator类介绍与API解释 1.Configurator类介绍 1)用于设置脚本动过的默认延时 2)功能 a.可调节两个模拟动作间的默认时间间隔 b.可调节输入文本的输入时间间隔 ...
- Linux iptables:规则原理和基础
什么是iptables? iptables是Linux下功能强大的应用层防火墙工具,但了解其规则原理和基础后,配置起来也非常简单. 什么是Netfilter? 说到iptables必然提到Netfil ...
- 「Python」python与微信
pip3 install itchat 主要用到的方法: itchat.login() 微信扫描二维码登录 itchat.get_friends() 返回完整的好友列表,每个好友为一个字典, 其中第一 ...
- 题解 P2762 【太空飞行计划问题】
P2762 太空飞行计划问题 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进 ...
- flex属性设置详解
CSS代码中常见这样的写法:flex:1 这是flex 的缩写: flex-grow.flex-shrink.flex-basis,其取值可以考虑以下情况: 1. flex 的默认值是以上三个属性值的 ...
- EL表达式格式化日期
在EL表达式中要显示"yyyy-MM-dd"格式的日期: 使用<fmt:>格式化标签 1 在页面上导入 <%@ taglib prefix=" ...
- struts2的action中@Autowired注入为null的解决方案
今天遇到类似问题,记录下来以便以后查阅: @Aspect作用于action,致使action中的@Autowired注入为null的解决方案,以下三种任选一种: 1.去掉@Autowired,改用se ...
- [Luogu 1196] NOI2002 银河英雄传说
[Luogu 1196] NOI2002 银河英雄传说 话说十六年前的 NOI 真简单... 我一开始还把题看错了- 题意:一群人,每个人各自成一队,每次命令让两队首位相接合成一队,每次询问问你某两个 ...
- c# windows server安装启动与卸载
使用installutil.exe安装卸载服务时,由于需要指向服务的全路径,由于生成目录往往不是服务发布的最终目录,很不便利,下面介绍两种方式方便操作: 方式一: 项目中加入install.bat与u ...