C++学习笔记3——数组和指针(重要)

来源:互联网 发布:node 捕捉子进程错误 编辑:程序博客网 时间:2024/06/10 09:07

数组是类似于vector类型的数据结构,是一种长度固定的存储一种存储单一数据类型对象的容器,通过在数组中的位置来访问其中的元素。

数组的维数必须用值大于等于1的常量表达式定义,包括:整数字面值常量、枚举常量、用常量表达式初始化的整形const对象。维数在方括号“[ ]”中指定。凡是到运行阶段才知道其值的对象都不能用于定义数组的维数

数组的显示初始化。int a[3]={0,1,2};若没有显示地提供元素初值,则数组元素会像普通变量一样初始化:在函数体外定义的内置数组,元素均初始化为0;在函数体内定义的内置数组,其元素无初始化;不管数组在哪里定义,若其元素为类类型,则自动调用该类的默认构造函数进行初始化;若该类没有默认构造函数,则必须为该数组的元素提供显示初始化。

显示初始化的数组不需要指定数组的维数值,编译器会根据列出的元素个数来确定数组的长度;若指定了数组位数,且初始化列表提供的元素个数不超过维数值,则初始化前面的数组元素,剩下的元素,若是内置类型则初始化为0,若是类类型,则调用该类的默认构造函数进行初始化。

对于字符数组char a[ ],也可以直接用字符串字面值进行初始化,char a[ ]=“abcd”; 此时,字符串字面值会包含一个额外的空字符null用于结束字符串。,在计算数组长度的时候,要将空字符考虑在内。

数组不能直接复制和赋值。

指针与vector中的迭代器类似,可以遍历数组。指针用于指向单个对象,它保存对象的地址 。定义指针变量:string  *a;或者是string*  a;对于第二种声明风格,千万不能认为string*是一种数据类型。

一个有效的指针必须是以下三种状态之一:1、保存一个特定对象的地址;2、指向某个对象后面的另一对象;3、0值。

指针初始化或者赋值的类型:1、0值常量表达式(0值以及在编译时可获得9值的整型const对象);2、类型匹配的对象的地址;3、另一对象之后的下一地址 4、同类型的另一个有效指针(两种例外情况)。

特殊的void*指针,因为其为空,所以可以保存任何类型对象的地址,但是其只支持有限的操作:1、与另一个指针进行比较;2、向函数传递void*指针或从函数返回void*指针;给另一个void*指针赋值。

指针可以间接地操作其所指向的对象,“*”操作符可以获取指针所知的对象:int a=1;int *b=&a;cout<<*b;则输出1。cout处的*表示解引用操作符,而声明中的*仅用来表示其实一个指针。既可以修改指针所指向对象的值,也可以修改指针本身所指向的对象。

指针和引用的区别:1、引用总是指向某个对象:定义引用时没有初始化是错误的。2、给引用赋值修改的是该引用所关联的对象的值,而对指针赋值,就改变了指针所指向的对象。

指向指针的指针:**操作符指派一个指针指向另一个指针。对这种指针解引用,得到的仍然是指针。

指针与数组元素:在表达式中使用数组名时,该名字自动转换为指向数组第一个元素的指针,即int a[ ]={0,1,2,3}; int *b=a; 则*b=a[0]

指针的算数操作:在指针上加一个整型数值,其结果仍然是指针,可以直接进行解引用操作。需要注意的是,解引用操作的优先级高于加法。可以使用指针来进行数组的遍历。

指针与const限定符  指向const对象的指针也必须具有const特性,包括void*类型的指针,也必须用const void*,若该指针指向了非const对象,任何通过指针修改此对象值的行为均会导致编译错误。但是可以通过其他方法修改const指针指向的对象。

const指针一旦定义之后,就不能再指向其他对象,const指针本身是const的事实并没有说明是否能用该指针修改它所指向对象的值,这个值能否修改取决于这个对象的类型。若是指向const对象的const指针,既不能修改其所指向的值,也不能修改器所指向的对象。

动态数组:动态分配的数组在运行时才确定长度。每个程序在执行是都占用一块可用的内存空间,称为自由存储区或堆,c++使用new和delete实现在自由存储区中分配存储空间。在动态分配数组时,只需定义指定类型和数组长度,不必为数组对象命名,new表达式返回指向新分配数组的第一个元素的指针:int *pia=new int[10];

用new可以动态创建长度为0的数组,此时new返回有效的非零指针。

动态分配的内存最后必须进行释放,需要显式的释放内存,delete[ ]用来释放指针所指向的数组空间:delete [] pia;

多维数组:int ia[2][3]={{1,2,3},{1,2,3}};2行3列的数组。和普通数组一样,使用多维数组名时,自动转换为指向该数组第一个元素的指针。同时由于多维数组就是数组的数组,所以指针就是指向第一个内层数组的指针

用typedef简化指向多维数组的指针typedef int b[3]; b *a=ia;用新定义的一个b来处理多维数组。


原创粉丝点击