C++ primer 数组和指针

来源:互联网 发布:网络优化工作美篇 编辑:程序博客网 时间:2024/05/22 02:21

数组和指针是类似于vector和迭代器类型的低级复合类型
数组也可以保存某种类型的一组对象
但数组长度是固定的,数组一经创建就不允许添加新的元素
指针像迭代器一样用于遍历和检查数组的元素
数组没有获取容量大小的size操作,也不提供push_back操作在其中自动添加元素

数组由类型名、标识符和维数组成的复合数据类型
类型名可以是内置数据类型和类类型
显示初始化数组元素,花括号括起来,逗号分隔的初值
显示初始化数组不需要指定数组的维数值,编译器会根据列出的元素个数来确定数组的长度

字符数组既可以用一组花括号括起来,逗号隔开的字符字面值进行初始化,也可以用一个字符字面串进行初始化,会包含一个额外的空字符用来结束字符串
不允许数组直接赋值和复制
数组元素也可以用下标操作符访问,vecotr使用的是vector::size_type作为下标的类型,数组下标的正确类型是size_t

指针是用于数组的迭代器,指向数组中的一个元素
在指针上使用解引用符和自增操作符和迭代器一样
string *sp=&s ;定义了一个指向string类型的指针sp,初始化sp并使其指向string类型的对象s
使用 * 符号把一个标识符声明为指针
string *p ;
另一种风格
string* p ;
这里写图片描述
避免使用未初始化的指针
把int型变量赋值给指针是非法的
把指针初试化为NULL等价于初始化为0
指针只能初始化或赋值给同类型的变量地址或者指针

数组名其实是一个指针, s 和 &s 值相同,s的值是数组第一个元素的地址,*s取数组的第一个值,*s+1取数组的第二个值。

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

解引用符返回指定对象的左值,利用这个功能可以修改所指对象的值,同时还可以修改指针的值使指针指向另一个对象

指针和引用的区别
指针和引用都可以指向一个对象
区别:引用总是指向某个对象,定义引用时没有初始化是错误的,对引用赋值修改的是该引用指向的对象的值,而并不是使引用指向另一个对象

指向指针的指针
int *pi =&ival
int **ppi =&pi

*pi++ 等价于 *pi ; pi++

使用指针访问数组
指针指向数组时会自动指向数组的第一个元素
在指针上加上或减去一个整型数值n等效于获得一个新的指针,该指针指向原来指针指向元素的前n个或者后n个元素
指针的算数操作符只有在原指针和计算出来的新指针都指向同一个对象的元素,或者指向该数组存储空间的下一单元时才合法
如果指针指向一个对象,还可以在指针上加1来获取相邻的下一对象的指针
两个指针减法操作的结果是ptrdiff_t的数据
int ia[]={};
int *p=ia;

指针上加一个整型值在解引用
int last = *(ia + 4)

指向const 对象的指针也必须具有const特性
const doubel *cptr;
const 限定了cptr 所指对象的类型,而不是cptr本身
允许给cptr 重新赋值,使其指向另一个const 对象,但不能通过cptr改变其值
cptr一经定义就不允许修改其所指对象的值
理解其为‘自以为指向const对象的指针’

const 指针
int *const cure=&err
指针的值不可以修改,即不能使指针指向其他对象
与任何const量一样,const也必须在定义的时候初始化

c风格字符串
字符串字面值的类型是字符常量数组
c风格字符串是以空字符null结束的字符数组
char a1=[’s’,’d’,’f’,’\0’]
char a2=”char”
通过const char *sp来操作c风格字符串
这里写图片描述
必须包含头文件 #include< cstring >
传递给这些函数的指针必须具有非零值,并且指向以null结束的字符数组中的第一个元素
尽量避免使用c风格字符串

创建动态数组
数组变量通过指定类型,数组名和维数来定义,而动态分配数组时,只需要指定类型和数组长度,不必为数组对象命名。new 表达式返回指向新分配数组的第一个元素的指针
int *pia = new int[10];
new需要指定类型以及在方括号中给出数组的维数。
动态分配数组时,如果数组元素具有类类型,将使用该类的默认构造函数实现初始化,如果数组类型是内置类型,则无初始化。
int *pia =new int[10];没有初始化
int *pia=new int [10] ( );初始化为零
动态分配的内存最后必须进行释放,否则内存会逐渐耗尽。
delete [] pia ;
方括号必不可少,它告诉编译器该指针指向的是自由存储区的数组。
回收数组时缺少方括号对,会导致内存泄漏

混合使用标准库string 和 C风格字符串
字符串字面值初始化string对象,由于C风格字符串与字符串字面值具有相同的数据类型,而且都是以空字符null结束,因此可以把C风格字符串用在任何可以使用字符串字面值的地方。
反之,在要求C风格字符串的地方不可以直接使用标准库string 类型
string类提供了一个c_str()方法,返回C风格字符串

使用数组初始化vector对象
必须指出用于初始化式的第一个元素以及数组最后一个元素的下一个位置的地址。
vector < int > ivec( int _ arr+1,int _ arr+4) ; 将int _ arr 的第一个到第三个元素赋给ivec

多维数组
int ai[ 3 ][ 4 ] = {
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
}
int ai [3] [4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int ai [3] [4] ={{1},{2},{3}} ; 只初始化每一行的第一列
定义指向数组的指针,首先声明元素类型,后接(数组)变量名字和维数。
int ia[3][4];
int (*pi)[4] = ia; pi 是一个指向四维数组的指针,圆括号必不可少