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个元素

用下标访问指针:

1     int a[] = {1,2,3,4,5};
2     int *p = &a[2];
3     cout<<p[1]<<endl;    //print 4
4     cout<<p[-2]<<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对象的值

1     const int a = 1;
2     const int b = 2;
3     int c = 3;
4     const int *p = &a;    //valid
5     p = &c;    //invalid
6     p = &b;    //valid
7     *p = 3;    //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 多维数组

多维数组就是数组的数组

 

posted on 2015-11-27 16:20  已停更  阅读(331)  评论(0编辑  收藏  举报