概述
数组的定义和初始化
注意:
1.显示初始化数组元素
在函数体外定义的内置数组,其元素均初始化为0;
在函数体内定义的内置数组,其元素无初始化;
不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化,如果该类没有默认构造函数,则必须为该数组的元素提供显式的初始化。
2.特殊的字符数组
字符数组在特殊的字面值的情况下,默认在数组最后一位加null
char ca4[] = "c++" ; c++后跟null
3.不允许数组直接复制和赋值
注意:
与vector不同,数组不提供push_back或者其他的操作在数组中添加新元素,数组一经定义,就不允许再添加新元素。
如果必须在数组添加新元素,就必须自己管理内存:要求系统重新分配一个新的内存空间用于存放更大的数组,然后把原数组的所有元素复制到新分配的内存空间去
4.1 数组操作
数组下标的正确类型则是size_t
4.2 指针的引入
4.2.1 什么是指针
指针的概念很简单:指针用于指向对象。
4.2.2 指针的定义和初始化
string *p2;
另外一种声明指针的风格
string* p2;
C++继承了C语言中的NULL ,# cstdlib NULL to 0
void*指针
C++提供了一种特殊的指针类型 void*,它可以保存任何类型对象的地址:
void* 指针只支持有限的操作;
与另外一个指针进行比较;
向函数传递void指针或从函数返回void指针;
给另外一个void指针赋值。
不允许使用void指针操纵它所指向的对象。
4.3指针操作
4.3.2指针和引用的区别
int val = 1024,int val2=2048;
int *p1=&val,*p2=&val2;
p1 = p2; // 指针p1 指向p2
引用
int &ri = val;&ri2=val2;
ri = ri2; // ri内存中的值替换成val2;但是ri ,ri2引用内存中的值和原来引用方向一致
4.3.3 指向指针的指针
int val = 1024;
int *p = &val;
int **ppi = &p;
4.4 使用指针访问数组元素
c++语言中,指针和数组关系密切,特别是在表达式中使用数组名时,名字会自动转换为指向数组第一个元素的指针:
2个指针减法操作的结果是标准库类型ptrdiff_t的数据、这是signed整型。
4.4.1 解引用和指针算术操作之间的相互结果
int last = *(ia +4); // last=ia[4];
int a = *ia +4; // a = ia[0] + 4;
由于加法和解引用操作的优先级不同,圆括号是必须的。
4.5 指针和const 限定符
指向const 对象的指针和const指针
1.指向const 对象的指针
const double pi = 3.134;
double *ptr=π // 编译错误: ptr指针可能会改变pi的值,不符合const语义,所以编译错误.
const double *cptr=π //ok
不能使用void 指针保存const对象的地址,而必须使用const void类型的指针保存const对象的地址。
const int un = 43;
const void *cpv = &un;
void *pv=&un; // 编译错误
2.const 指针
除了指向const对象的指针外,c++还提供了const指针------本身的值不能修改:
int errnum =0;
int *const cur=&errnum;
cur = curerr; //任何给const指针赋值都是编译错误的。
与任何const 量一样,const指针必须在定义时初始化。
指针本身是const的事实并没有说明是否能使用该指针修改它所指向的对象的值。指针所指向对象的值能否修改完全取决于该对象的类型。
3.指向const对象的const指针
const double pi = 3.14;r
const double *const pi_ptr = π
既不能修改pi_ptr所指向的对象的值,也不允许修改该指针的指向。
4.指针和typedef
typedef string *pstring;
const pstring cstr;
cstr是什么类型?错误的回答是:const pstring是一种指针,指向string类型的const对象,但这是错误的。
错的原因是:在于将typedef当做文本拓展了。声明const pstring时,const修饰的是pstring的类型,这是一个指针,因此,声明语句应该是把cstr定义为指向的string类型对象的const指针,这个定义等价为:
string *const cstr;
建议:
阅读const声明语句时容易出现错误,源于const限定符既可以放在类型前面也可以放在类型后:
string const s1;
const string s2;
typedef 写const类型定义时,const限定符加在类型前面容易引起对所定义的真正类型的误解:
string s;
typedef string *pstring;
const pstring cstr1= &s;
pstring const cstr2 =&s;
string *const cstr3= &s;
cstr1 ,2,3都是一样的意思。
4.6 C风格字符串
字符串字面值的类型就是 const char类型的数组。
C风格字符串就是以空字符null结束的字符数组.
char ca1[] = {'C','+','+'};
char ca2[] = {'c','+','+','