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

C++primer学习笔记第四章-数组与指针

2016-10-23 13:27 288 查看
一、数组

1.数组的长度是固定,指的是一旦初始化就不能改变,相比vector是缺陷,但是速度更快;

2.初始化数组时,维数一定要是整型字面值常量、枚举常量或者const对象;如果没有显示初始化,则在函数体外默认初始化,函数体内不自动初始化;如果是类类型,则调用默认构造函数;

3.不允许数组直接复制和赋值,与vector不同;

4.数组下标类型是size_t;

二、指针

1.声明:int *p1;

2.避免使用未初始化的指针,如果要分开定义指针和指向的对象,则将指针初始化为0,表示不指向任何对象;

3.指针和下标:int a[]={0,2,4,6,8}; int *p=&a[2];
则int j=p[1];//p[1]相当于*(p+1),a[3],6
,相当于解引用

int k=p[-2];//k相当于0

4.指向const对象的指针:const double *p;p指针可以改变指向,但不能改变指向的对象,因为对象为const,不需要进行初始化。

Const指针:int i=0; int const* p =&i;必须初始化,不能改变指向。

5.在 typedef中使用指针往往会带来意外的结果。下面是一个几乎所有人刚开始时都会答错的问题。假设给出以下语句:

typedef string *pstring;

 

const pstring cstr;

请问 cstr 变量是什么类型?简单的回答是
const pstring 类型的指针。进一步问:const pstring
指针所表示的真实类型是什么?很多人都认为真正的类型是:   const string *cstr;
也就是说,const pstring
是一种指针,指向 string
类型的 const
对象,但这是错误的。错误的原因在于将 typedef
当做文本扩展了。声明 const pstring
时,const
修饰的是 pstring
的类型,这是一个指针。因此,该声明语句应该是把 cstr
定义为指向 string
类型对象的 const
指针,这个定义等价于: string *const cstr。

string s;

typedef string *pstring;

const pstring cstr1 = &s; // written this way the type is obscured

pstring const cstr2 = &s; // all three decreations are the same type

string *const cstr3 = &s; // they're all const pointers to string

【const有向右结合性,优先修饰右边的元素】

三、C风格字符串

1.标准库函数,首先引入头文件 #include<cstring>

strlen(s) ;返回s的长度,不包括字符串结束符null;注意:函数是以Null作为结束符。
对于char风格的:char ca1[]={‘C’,’+’,’-’};这里末尾没有null,最好别用

                 char ca2[]=”C+-”;系统末尾自动添加Null

2.动态数组:动态分配的数组不必再编译时知道其长度,可以在运行时才确定数组的长度。与数组变量不同,动态数组将一直存在,知道程序显式释放它为止。

C语言中使用一对标准库函数malloc和free在自由存储区中分配存储空间,C++使用new和delete

3.动态数组的定义只需指定类型和数组长度,不必为数组对象命名;

int *pia=new int[10];//返回指向新分配数组的第一个元素的指针。

且动态数组的初始化只能是元素类型的默认值,类类型为默认构造函数,内置类型无初始化。
内置类型可以通过 int *pia =new int[10]();//初始化为0
注意:用New动态创建长度为0的数组是合法的,但如果是数组变量就不行;

4.动态空间的释放: delete [] pia; // []表示是数组而非单个对象

5.const char *str=st2.c_str(); //c_str()返回指针指向C风格字符串的const char类型的数组,并且以null结束符

 

四、多维数组

1.int ia[3][4]={{0},{4},{8}};只初始化了每行的第一个元素,其他的函数体内默认初始化为0,函数体外没有初始化。

2.多维数组其实就是数组的数组,因此它的指针,应该是指向第一个内层数组的指针。

int ia[3][4];Int (*p)[4]=ia;ip=&ia[2];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: