C++ Primer 随笔 Chapter 4 数组和指针
1.数组:数组是由类型名、标识符和维数组成的符合数据类型,类型名规定了存放在数组中的元素类型,维数规定数组中包含元素的个数而标识符就是数组的名称。例如:
int arr[10]; 其中 int 是类型名,arr是标识符而 10 是数组的维数。
2.数组的定义和初始化:数组的初始化要注意以下几点
(1). 数组中存放的元素类型不能是引用类型,除此之外可以是其他任何类型。
(2). 数组的维数必须是字面值常量、枚举常量或者常量表达式(但不能是在运行时才知道其值得常量表达式)
(4). 显示初始化整形数组时,如果 {} 内元素的个数小于数组维数,那么剩下的元素初始化为 0, 如果 {} 内元素个数大于数组的维数,会报错。
(5). 如果不显示初始化数组,那么数组会像普通变量一样初始化:
(a). 在函数体外定义的内置数组,其元素均初始化为 0.
(b). 在函数体内定义的内置数组,其元素无初始化.
(c). 不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化。如果该类没有默认构造函数,则必须为数组的元素提供显示初始化。
3.指针:指针用于指向对象。具体来说,指针保存的是另一个对象的地址。
4.指针的定义:
(1). 指针定义的时候推荐写法应该是这样 int *ip 而不是 int* ip,也就是说让 * 更靠近变量。为什么这样?如果一个定义这样写 int* ip1,ip2,会让很多人误以为 int * 是一种指针类型,这样定义出来的 ip1 与 ip2 都是 int * 类型,实际上只有 ip1 是而 ip2 是 int 型。但如果这样写:int *ip1,ip2,就不会让人产生这么大误会了。
(2). 指针的初始化或复制只能是一下四种类型的值:
(a). 0 值表达式,例如,在编译时可获得 0 值得整型 const 对象或字面值常量 0.
(b). 类型匹配的对象的地址.
(c). 另一个对象之后的下一个地址.
(c). 同类型的另一个有效指针.
5.void 指针:它可以保存任何类型对象的地址。
6.指针与引用的比较:
(1). 引用总是指向某个对象:定义引用时没有初始化时错误的。
(2). 给指针赋值是让指针指向另一个对象而给引用赋值是修改该引用所关联的对象的值。
7.指针和 const 限定符:
(1). 指向 const 对象的指针:const int *cip; 这里定义的指针 cip 是一个指向 const 对象的指针,表示不能通过指针的解引用操作来改变 cip 所指向的内容。
(2). const 指针: int errNumb = 0; int * const curErr = &errNum; 这里定义的 curErr 是一个 const 指针,表示这个指针本身不能被改变,所以它在被定义的时候就必须被初始化。
(3). 指向 const 对象的 const 指针:const int pi = 3; const int * const pi_ptr = π 这里定义的是一个指向 const 对象的 const 指针,它本身和指向的对象内容都不能被改变。
(4). 这里需要注意的是:
(a). 不能使用 void * 指针保存 const 对象的地址,而必须使用 const void * 类型的指针保存 const 对象的地址,下面的例子是错误的:
const int universe = 42; void * cpv = &univers; 而 const void * cpv = &universe 才是正确的写法。
(b). 不能把 const 对象的地址赋值给一个非指向 const 对象的指针,但是允许将非 const 对象的地址赋值给一个指向 const 对象的指针。例子如下:
const double pi = 3.14;//↓ | double pi = 3.14; ↓
double *ptr = π //错误↓ | const double *cptr = π// 正确
const double cptr = π //正确
8. C风格字符串:char p[] = "hello"; 此数组 p 维数是 6 而不是5 ,为什么呢?因为该字符串后面还有一个空字符null。类似的以空字符null结束的字符数组就是 C 风格字符串。我们需要注意的是:C 语言标准库提供的一系列 C 风格字符串的库函数要求传入的字符串参数必须以空字符 null 结束。
9. 指针数组与数组指针:
(1). int (*p)[10]; 由于 () 的优先级高,p 与 * 结合,说明 p 是一个指针;那么这样定义出来的 p 就是数组指针,一个指向拥有 10 个整形元素的数组的指针。
(2). int * p[10]; 由于没有 (), 故 [] 优先级高,先与p结合成为一个数组,说明是 p 表示的数组。而 int * 在这种情况下可以看着是一种数据类型---整型指针。这样就容易理解:数组 p 里面存放 10 个 int * 类型的元素。
建议:尽量避免使用指针和数组,用 vector 代替数组,用迭代器代替指针,用 string 类型取代 C 语言风格的字符串。
C++ Primer 随笔 Chapter 4 数组和指针的更多相关文章
- C++ Primer 随笔 Chapter 13 复制控制
1.复制控制包含的内容:复制构造函数.赋值操作符.析构函数 2.复制构造函数: a. 定义:只有单个形参,而且该形参是对本类类型的引用,这样的构造函数被成为复制构造函数 b. 适用情况: (1)根据一 ...
- C++ Primer 随笔 Chapter 9 顺序容器
参考:http://www.cnblogs.com/kurtwang/archive/2010/08/19/1802912.html 1..顺序容器:vector(快速随机访问):list(快速插入 ...
- C++ Primer 学习笔记_Chapter4 数组和指针–指针
一.什么是指针? 指针与迭代器一样,指针提供对其所指对象的间接访问,指针保存的是另一个对象的地址: string s("hello"); string *ps = &s; ...
- C++ Primer 随笔 Chapter 10 关联容器
1.关联容器的类型:map(键-值对的集合,可理解为关联数组), set(单纯的键的集合), multimap(一个键对应多个值,键唯一), multiset(相同键可以是多个). 2.pair类型提 ...
- C++ Primer 随笔 Chapter 2 变量和基本类型
2.1C++内置类型 C++ 算术类型 类型 含义 最小存储空间(随机器不同而不同) bool 布尔型 --- char 字符型 8位 wchar_t 宽字符型 16位 short 短整型 16位 i ...
- 把《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 Plus 第10章 数组和指针 编程练习
这章感觉好难啊,放个别人的总结. // 多维数组和指针 #include <stdio.h> int main(void) { int zippo[4][2] = {{2, 4}, {6, ...
- c++ primer 4 数组和指针
类比的思想学习数组和指针,c++提供类似于vector和迭代器的低级复合类型——数组和指针.与vector相似,数组可以保存某一种类型的一组对象:而他们的区别在于,数组的长度固定,数组一经创建就不允许 ...
随机推荐
- EF的TransactionScope
TransactionScope是一个分布式事务的语句块,被包含起来的语句一起被提交,当出现异常,一起回滚,这都是托管的 当Web没有开启MSDTC服务时候会出现:
- Use excel Macro export data from database
Sub DownLoadMacro() '定义过程名称 Dim i As Integer, j As Integer, sht As Worksheet 'i,j为整数变量:sht 为excel工作表 ...
- Oracle中用一张表的字段更新另一张表的字段
今天在做项目的过程中,发现开发库中某张表的某字段有许多值是空的,而测试库中该字段的值则是有的. 那么,有什么办法能将测试库中该字段的值更新到开发库中呢? SQL Server中这是比较容易解决的,而O ...
- OC与Swift的区别一(文件结构)
1.文件后缀名 oc的文件后缀名为:头文件.h 主体文件.m swift文件后缀名为:.swift 2. 代码分隔符 oc中使用分号;作为代码分隔符 swift中无需使用代码分隔符,以行作为代码分隔 ...
- ArcGis for WPF(1)
这篇文章主要是讲窗体中怎么加载一张在线地图. 第一步:首先引用ESRI.ArcGIS.Client.dll类库. 第二步:在XAML中添加如下代码: <Window x:Class=" ...
- struts 模型驱动
情景: 有一个用来处理用户的UserAction 类, 该动作类实现了 ModelDriven 接口. 当用户触发UserAction 动作时, ModelDriven 拦截器将调用相关UserAct ...
- Codevs 4560 NOIP2015 D2T2 子串
> 4560 NOIP2015 D2T2 子串 时间限制: 1 s 空间限制: 128000 KB 题目等级:黄金 Gold 题目描述 Description 有两个仅包含小写英文字母的字符串A ...
- Centos学习手册——装逼宝典之强制重置密码
---恢复内容开始--- Centos学习手册by RuffianFish; 痞子鱼 近日闲的无聊,而最近又在搞Centos决定写个Centos详细的学习手册,以便自己在长时间没摸Centos的情况下 ...
- apache配置文件中的项目
对于每个配置项目,有几个要素: 首先是项目名称 其次是配置的语法 再次是配置的默认值 配置所处的配置文件的位置(分区) 配置所在的模块分区(和核心是否紧密) 配置项目所在的模块 所以对于每个配置项目, ...
- File控件杂谈
我们通常使用<input type='file'/>来实现网页中文件上传功能,用户可以通过点击file控件选择本地文件,当我们提交包含该控件的表单时,浏览器会向服务器发送用户选中的文件. ...