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相似,数组可以保存某一种类型的一组对象:而他们的区别在于,数组的长度固定,数组一经创建就不允许 ...
随机推荐
- LiangNa Resum
LiangNa AnShan Street, YangPu, NY @.com OBJECTIVE: Seeking a position to contribute my skills and ed ...
- BigInteger构造函数解析
1.BigInteger(byte[] val)这个构造函数用于转换一个字节数组包含BigInteger的二进制补码,以二进制表示成一个BigInteger. (用字节数组中值的ASCII码构造Big ...
- rc4加密
function RC4(Expression, Password: string): string; var RB : array[0..255] of Integer; X, Y, Z: long ...
- 如何诊断oracle数据库运行缓慢或hang住的问题
为了诊断oracle运行缓慢的问题首先要决定收集哪些论断信息,可以采取下面的诊断方法:1.数据库运行缓慢这个问题是常见还是在特定时间出现如果数据库运行缓慢是一个常见的问题那么可以在问题出现的时候收集这 ...
- Objective-C 中的方法回掉
Objective-C 中的方法回掉 Objective-C 中的方法调用 OC 类似C+,避免不了的内部的各种通信手段,函数调用,变量传递等,避免不了各种回掉等. 一.class直接调用 或者 o ...
- 初尝seajs,只提供自己学习做笔记
(仅供自己使用,勿喷) 闲着无聊,尝试下seajs, 只是在公司项目上随便添加并测试了一下,做下记录, 方便以后自己使用更快的上手: 下载最新的sea.js, v- 3.0.0 新建seajsConf ...
- Gradle教程之任务管理
简要概述依赖管理 不算完美的依赖管理技术 自动管理依赖的重要性 自动依赖管理面临的挑战 声明依赖 外部模块依赖 文件依赖 配置远程仓库 这一章我将介绍Gradle对依赖管理的强大支持,学习依赖分组和定 ...
- Dynamic Programming: From novice to advanced
作者:Dumitru 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=dynProg An impo ...
- IOS 学习笔记 2015-03-27 我理解的OC-代理模式
案例1 KCButton.h // // KCButton.h // Protocol&Block&Category // // Created by Kenshin Cui on 1 ...
- C++11中新特性之:lambda 表达式
首先摆出Lambda表达式语法 lambda-expression: lambda-introducer lambda-declaratoropt compound-statementlambda-i ...