第四章 数组和指针

来源:互联网 发布:云计算的阅读及答案 编辑:程序博客网 时间:2024/05/18 08:41

4.1数组

在函数体外定义的内置数组,所有元素都将初始化为0

在函数体内定义的内置数组,所有值均不会初始化

不管数组在哪里定义,如果数组类型为类,则会自动调用该类的默认构造函数进行初始化,如果该类没有默认构造函数,则必须为该数组提供显示初始化。
数组的长度是固定的,一经定义就不可变

4.2指针的引入

注意*号和取地址符&(address-of)的应用,取地址符只能用于左值!

指针的初始化赋值,只能是以下四种类型

1.0值表达式

2.类型匹配的对象的地址

3.另一对象之后的下一地址

4.同类型的另一个有效指针

int k=5;
//both int *s=k and int *s=5 are error
int *s=&k;

C++ 提供了一种特殊的指针类型void*指针,他可以保存任何类型对象的地址

但是VOID*类型指针只支持有限的集中操作

1.与另一个指针进行比较

2.向函数传递void*指针或者从函数返回void*指针

3.给另一个void*指针赋值

指针和引用的比较:

第一区别在于 引用总是指向某个对象,定义引用时必须初始化。第二个区别在于 赋值的时候,引用赋值会改变引用所关联对象的值,而指针改变的是指针与指针所指向对象的关联。另外引用一经初始化,就始终指向同一特定对象。

指针也可以再指向指针

只要两个指针指向同一数组或者有一个指向该数组末端的下一单元,C++还支持对这两个指针做减法操作。结果是C++的标准库类型ptrdiff_t的数据类型。注意size_t是unsigned整型,ptrdiff_t是signed整型。

C++允许计算数组或对象的超出末端地址,但不允许对此地址进行解引用操作。而计算数组超出末端位置后或数组的首地址之前都是不合法的。

把一个const对象的地址赋给一个非const的对象的指针是错误的

不能使用void*指针保存const对象的地址,但可以用const void*类型指针保存const对象的地址。

允许把非const的对象的地址赋给指向const对象的指针。

const变量必须在定义时初始化,const指针也不例外。

4.3 C风格字符串

永远不要忘记字符串结束符 null

注意目标字符串必须具有足够的大小

strn系列处理函数更加安全

strlen函数不计算最后null的长度

尽可能的使用string标准库类型

4.3.1创建动态数组

每一个程序执行的时候都占用一块可用的内存空间,用于存放动态分配的对象,这种空间成为程序的自由储存区(free store)和堆(heap)。C语言程序使用malloc和free在自由储存区中分配空间,在C++使用new和delete表达书实现相同的功能,注意,程序员必须显式的将其占用的空间还给程序自由储存区。

注意 delete和delete []的区别

4.3.2注意新旧代码的兼容

注意可以使用C风格字符串对string进行初始化和赋值

string有个c_str函数可以把string转换成C风格字符串,注意这个函数返回的是一个const cahr指针类型

用数组初始化vector类型对象时,必须指出用于初始化的第一个元素以及数组最后一个元素的下一个位置的地址,比如:

const size_t arr_size=6

int int_arr[arr_size]={0,1,2,3,4,5};

vector<int> ivce(int_arr,int_arr+arr_size);

//或者

vector<int> ivec(int_arr+1,int_arr+4);

4.4多维数组

其实C++并没有多维数组,通常所说的多维数组其实就是数组的数组

多维数组的第一维被称为行(row),第二维则被称为列(column)。C++没有限制下标的个数

与一维数组一样,有些元素将不使用初始化列表提供的初始化式进行初始化。?

注意一些特殊的声明

比如int (*ip)[4];代表的是*ip是int[4]类型 即ip是一个指向含有4个元素的数组的指针。

而int *ip[4]是4个指向int的指针

 

原创粉丝点击