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 数组和指针的更多相关文章

  1. C++ Primer 随笔 Chapter 13 复制控制

    1.复制控制包含的内容:复制构造函数.赋值操作符.析构函数 2.复制构造函数: a. 定义:只有单个形参,而且该形参是对本类类型的引用,这样的构造函数被成为复制构造函数 b. 适用情况: (1)根据一 ...

  2. C++ Primer 随笔 Chapter 9 顺序容器

     参考:http://www.cnblogs.com/kurtwang/archive/2010/08/19/1802912.html 1..顺序容器:vector(快速随机访问):list(快速插入 ...

  3. C++ Primer 学习笔记_Chapter4 数组和指针–指针

    一.什么是指针? 指针与迭代器一样,指针提供对其所指对象的间接访问,指针保存的是另一个对象的地址: string s("hello"); string *ps = &s; ...

  4. C++ Primer 随笔 Chapter 10 关联容器

    1.关联容器的类型:map(键-值对的集合,可理解为关联数组), set(单纯的键的集合), multimap(一个键对应多个值,键唯一), multiset(相同键可以是多个). 2.pair类型提 ...

  5. C++ Primer 随笔 Chapter 2 变量和基本类型

    2.1C++内置类型 C++ 算术类型 类型 含义 最小存储空间(随机器不同而不同) bool 布尔型 --- char 字符型 8位 wchar_t 宽字符型 16位 short 短整型 16位 i ...

  6. 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1.我们知道,将一个数组赋给另一个数组,就是将一个数组的元素逐个赋值给另一数组的对应元素,相应的,将一个vector 赋给另 ...

  7. 【C语言学习】《C Primer Plus》第10章 数组和指针

    学习总结 1.数组初始化方式: int a[]={1,2,3} int a[SIZE]={1,2,3} //SIZE是宏定义,数组初始化个数不能大于SIZE,否则报错:当个数小 //SIZE,自动补0 ...

  8. C Primer Plus 第10章 数组和指针 编程练习

    这章感觉好难啊,放个别人的总结. // 多维数组和指针 #include <stdio.h> int main(void) { int zippo[4][2] = {{2, 4}, {6, ...

  9. c++ primer 4 数组和指针

    类比的思想学习数组和指针,c++提供类似于vector和迭代器的低级复合类型——数组和指针.与vector相似,数组可以保存某一种类型的一组对象:而他们的区别在于,数组的长度固定,数组一经创建就不允许 ...

随机推荐

  1. [02] Oracle简单单行函数(字符+数值+日期+转换+通用)

    1. 字符函数 --upper(str), lower(str):将str转换成大,小写 select upper('hello') as x1, lower('HELlo') as x2 from ...

  2. vmstat,iostat,sar命令详解

    Procs r: 等待运行的进程数 b: 处在非中断睡眠状态的进程数 w: 被交换出去的可运行的进程数.此数由 linux 计算得出,但 linux 并不耗尽交换空间 Memory swpd: 虚拟内 ...

  3. Ext.Net学习笔记06:Ext.Net DirectEvents用方补充

    在ASP.NET控件上面使用DirectEvents 我们在ASP.NET中实现无刷新的页面请求的时候,通常会用到UpdatePanel,现在Ext.Net为我们提供了另外一种渠道:通过DirectE ...

  4. iOS开发——TTS文本发音

    iOS的文本转发音,从iOS7开始,iOS系统自带这个功能.能够实现中文.英文的发音.而且实现的起来非常方便.就像我看到有的博主说的三行代码搞定. (在iOS7之前(目前已不适配了),比如iOS6实现 ...

  5. iOS-事务相关

    事务管理 事务(Transaction):1.构成单一逻辑工作单元的操作集合DBMS中的用户程序DBMS外的可执行程序对数据库的读/写操作序列2.读从数据库中读取数据,首先从磁盘中读到内存(Buffe ...

  6. SDL实现限制帧速

    很多人都在SDL_PollEvent和SDL_WaitEvent之间纠结.前者会带来更好的帧数表现,但是CPU占用极大,可以直接吃掉一个核心.后者则基本不占用CPU,但是帧数会受到影响.有没有办法使两 ...

  7. OpenJudge 2815 城堡问题 / Poj 1164 The Castle

    1.链接地址: http://bailian.openjudge.cn/practice/2815/ http://poj.org/problem?id=1164 2.题目: 总时间限制: 1000m ...

  8. ORACLE数据库闪回日志写满

    网站页面无法显示完整.检查web服务是正常的,所以可能是ORACLE数据库出了问题. 首先检查闪回日志写满 然后检查归档日志文件写满的缘故了.使用以下几个命令可以看出当前归档日志文件的使用情况: se ...

  9. Ubuntu不卸载ibus前提下安装搜狗输入法

    第一步 在命令行中输入以下行命令安装fictx框架 sudo apt-get install fcitx fcitx-config-gtk im-switch 第二步 去 http://pinyin. ...

  10. jQuery 快速入门教程

    内容目录 jQuery 入门 什么是jQuery 如何使用jQuery jQuery的运行原理 如何选择jQuery版本 ready() 准备就绪时执行代码 jQuery 核心:选取元素 使用jQue ...