您的位置:首页 > 编程语言 > C语言/C++

c++primer阅读笔记之数组与指针

2016-02-21 21:21 344 查看

C++primer阅读笔记之数组与指针

数组

数组简述

对于数组,首先要强调的就是数组的维数定义必须使用值大于等于1的常量表达式定义

常见的常量表达式有:

整型字面值常量(1,2,3…)

枚举常量

用常量表达式初始化的整型const对象

数组初始化方式

显示初始化数组元素(int a[] = {1,2,3};)

显示初始化数组无需指定维数,编译器会依据初始化列表中的元素个数决定数组的长度

如果指定了维数,那么初始化列表中的元素个数不能大于指定的维数

对于字符数组,其除了可以用初始化列表进行初始化,还可以用字符串字面值来进行初始化(char a[] = “abc”),用字符串字面值进行初始化的时候要注意字符串字面值最后的空字符,因为字符串字面值使用空字符结束字符串,因此对于括号中的例子,该字符数组应有4个元素

没有显示初始化

在函数体外定义的内置数组,其元素均初始化为0;

在函数体内定义的内置数组,其元素均无初始化;

如果其元素为类类型,则自动调用该类的默认构造函数进行初始化,如果没有默认构造函数,则必须为该数组的元素显示初始化

数组的主要限制

数组长度固定不变;

在编译时,必须知道其长度;

数组只在定义它的块语句内存在

动态数组

程序利用堆/自由存储区来存放动态分配的对象

数组变量通过指定类型,数组名和维数来定义。而动态分配数组时,只需要指定类型和数组长度,不必为数组对象命名,new表达式返回指向新分配数组的第一个元素的指针

int *pia = new int[10]; //会分配空间但不进行值初始化
int *pia = new int[10]();   //会分配空间而且会进行值初始化


对于初始化问题:

数组元素为内置类型,无初始化

数组元素为类类型,使用类的默认构造函数实现初始化

如果在堆中创建的数组存储了内置类型的const对象,则必须为这个数组提供初始化

何时使用动态数组?

当我们在编译的时候,并不知道数组的长度的时候,我们可以使用动态数组。

int *pia = new int
;  //对于动态数组,可以用非常量来作为数组的长度,等在运行时候,再确定数组长度即可
delete [] pia;  //在使用完之后,要释放数组所占用的空间


在创建动态数组不再用的时候,我们必须要记得用delete方法释放指针所指向的数组空间

note:

现代C++程序设计应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。只有在特别强调速度的时候,才在类实现的内部使用数组和指针

数组与vector不同,其不能直接进行复制和赋值,即无法用一个数组来对另一个数组进行初始化,也不能将一个数组赋值给另一个数组

指针

三大操作符

*解引用操作符

解引用操作符,用于获得指针所指对象的值,其返回的是该对象的引用

++自增操作符

使用自增操作符来指向下一个元素

&取地址操作符

指针简述

用一句话说,指针所保存的值是其所指向对象的地址,即指针是对内存地址做操作的,其通过解引用符间接对所指对象做操作。我们要一直保持一个信念就是指针保存的是地址,而非变量值!因为指针保存的是所关联对象的地址,因此指针也是占用内存位置的,因此指针本身也是可用指针指向的内存对象,故也存在指向指针的指针

指针的定义与初始化

指针的定义

使用*符号把一个标识符声明为指针(string *s),这里要注意,*在用于定义变量的时候,表示该变量为指针,在其余地方的时候,其作为解引用用于获得指针所指向对象的值

指针的初始化

初始化或赋值使用的4中类型的值

0常量表达式(把指针初始化为NULL与初始化为0是等效的)

类型匹配的对象的地址(string sp = &s)

另一对象的下一个地址

同类型的另一个有效指针

void*指针

void*指针可以保存任何类型的地址

支持的操作

与另一个指针比较

以参数的形式向函数传递vodi*指针或者返回void*指针

给另一个void*指针赋值

void*指针是不能用于操纵它所指向的对象的

指针与const

指向const对象的指针(const int *cp)

如果指针指向const对象,则不允许用指针来改变其所致的const值,const int *cp中的const限定的是指针所指向的对象,而不是指针本身,当将一个指针声明为一个指向const对象的指针的时候,该指针能够改变所指向的对象,但是不能改变所指向对象的值(无论该对象是const对象还是非const对象)

不能把一个const对象赋值给一个指向非const对象的指针

可以把一个非const对象赋值给一个指向const对象的指针,但是不能通过该指针改变所指对象的值

const指针(int *const cp = &i)

const指针,本身的值是不能修改的,即不能改变其所指向的对象

const指针必须初始化,因为其不能改变所指向的对象,因此在定义的时候必须初始化

const指针所指向对象的值能否修改,完全取决于对象本身,如果对象本身是非const的,则可以修改,如果是const,则不可修改(被称为指向const对象的const指针const int *const cp = &i)

指针与迭代器的区别

指针用于指向单个对象,而迭代器只能用于访问容器内的元素,无法指向单个对象

指针与引用的区别

引用必须指向某个对象,在定义引用时,必须对引用进行初始化,如果没有初始化,在编译的时候就会报错。但是指针则不是必须初始化的。造成这种情况的原始是引用一旦初始化,就始终指向同一个特定的对象,不能再做改变,而指针则不同,其实可以改变指向对象的。我们可以把引用看作所关联变量的一个别名,只能关联初始化时的变量。

给引用赋值修改的是该引用所关联的对象的值,而并不是使得引用与另一个对象关联,而指针则可以转移关联对象

int a = 10;
int b = 20;
int &s = a;
int *p = &a;
s = b;  //在这里我们可以观察到a的值也变成了20,即对引用进行赋值的时候,并不是使得s指向了b,而是将b的值赋值给了a,也就是一旦给引用s初始化之后,其就只能指向该对象
p = &b; //这里指针p将会指向b而不再指向a


note:

不要使用未初始化的指针,在使用之前,一定要初始化所有的指针

如果指针保存0值,表明其不指向任何对象

在表达式中使用数组名时,该名字会自动转换为指向数组第一个元素的指针

如果指针p指向数组的第一个元素,那么p+数组长度指向的是数组超出末端的位置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: