数组的定义和初始化
注意:
1.显示初始化数组元素
在函数体外定义的内置数组,其元素均初始化为0;
在函数体内定义的内置数组,其元素无初始化;
不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化,如果该类没有默认构造函数,则必须为该数组的元素提供显式的初始化。
2.特殊的字符数组
字符数组在特殊的字面值的情况下,默认在数组最后一位加null
1
2char ca4[] = "c++" ; c++后跟null
3.不允许数组直接复制和赋值
注意:
与vector不同,数组不提供push_back或者其他的操作在数组中添加新元素,数组一经定义,就不允许再添加新元素。
如果必须在数组添加新元素,就必须自己管理内存:要求系统重新分配一个新的内存空间用于存放更大的数组,然后把原数组的所有元素复制到新分配的内存空间去
4.1 数组操作
数组下标的正确类型则是size_t
4.2 指针的引入
4.2.1 什么是指针
指针的概念很简单:指针用于指向对象。
4.2.2 指针的定义和初始化
string *p2;
另外一种声明指针的风格
string* p2;
C++继承了C语言中的NULL ,# cstdlib NULL to 0
void*指针
C++提供了一种特殊的指针类型 void*,它可以保存任何类型对象的地址:
void* 指针只支持有限的操作;
与另外一个指针进行比较;
向函数传递void指针或从函数返回void指针;
给另外一个void指针赋值。
不允许使用void指针操纵它所指向的对象。
4.3指针操作
4.3.2指针和引用的区别
1
2
3
4int val = 1024,int val2=2048; int *p1=&val,*p2=&val2; p1 = p2; // 指针p1 指向p2
引用
1
2
3int &ri = val;&ri2=val2; ri = ri2; // ri内存中的值替换成val2;但是ri ,ri2引用内存中的值和原来引用方向一致
4.3.3 指向指针的指针
1
2
3
4int val = 1024; int *p = &val; int **ppi = &p;
4.4 使用指针访问数组元素
c++语言中,指针和数组关系密切,特别是在表达式中使用数组名时,名字会自动转换为指向数组第一个元素的指针:
2个指针减法操作的结果是标准库类型ptrdiff_t的数据、这是signed整型。
4.4.1 解引用和指针算术操作之间的相互结果
1
2
3int last = *(ia +4); // last=ia[4]; int a = *ia +4; // a = ia[0] + 4;
由于加法和解引用操作的优先级不同,圆括号是必须的。
4.5 指针和const 限定符
指向const 对象的指针和const指针
1.指向const 对象的指针
1
2
3
4const double pi = 3.134; double *ptr=π // 编译错误: ptr指针可能会改变pi的值,不符合const语义,所以编译错误. const double *cptr=π //ok
不能使用void 指针保存const对象的地址,而必须使用const void类型的指针保存const对象的地址。
1
2
3
4const int un = 43; const void *cpv = &un; void *pv=&un; // 编译错误
2.const 指针
除了指向const对象的指针外,c++还提供了const指针------本身的值不能修改:
1
2
3
4int errnum =0; int *const cur=&errnum; cur = curerr; //任何给const指针赋值都是编译错误的。
与任何const 量一样,const指针必须在定义时初始化。
指针本身是const的事实并没有说明是否能使用该指针修改它所指向的对象的值。指针所指向对象的值能否修改完全取决于该对象的类型。
3.指向const对象的const指针
1
2
3const double pi = 3.14;r const double *const pi_ptr = π
既不能修改pi_ptr所指向的对象的值,也不允许修改该指针的指向。
4.指针和typedef
1
2
3typedef string *pstring; const pstring cstr;
cstr是什么类型?错误的回答是:const pstring是一种指针,指向string类型的const对象,但这是错误的。
错的原因是:在于将typedef当做文本拓展了。声明const pstring时,const修饰的是pstring的类型,这是一个指针,因此,声明语句应该是把cstr定义为指向的string类型对象的const指针,这个定义等价为:
string *const cstr;
建议:
1
2
3
4
5
6
7
8
9
10
11
12阅读const声明语句时容易出现错误,源于const限定符既可以放在类型前面也可以放在类型后: string const s1; const string s2; typedef 写const类型定义时,const限定符加在类型前面容易引起对所定义的真正类型的误解: string s; typedef string *pstring; const pstring cstr1= &s; pstring const cstr2 =&s; string *const cstr3= &s; cstr1 ,2,3都是一样的意思。
4.6 C风格字符串
字符串字面值的类型就是 const char类型的数组。
C风格字符串就是以空字符null结束的字符数组.
1
2
3
4
5
6
7char ca1[] = {'C','+','+'}; char ca2[] = {'c','+','+',''}; char ca3[] = {"C++"}; const char *cp = "c++"; char *cp1 = ca1; char *cp2 = ca2;
ca1 和cp1 都不是C风格,都不是以null结尾的。
处理C风格的头文件在C语言:
#include 是string.h的C++版本,string.h是C语言提供的标准库,
1
2
3
4
5
6
7strlen(s) 返回s的长度,不包括字符串结束符null strcmp(s1,s2) 比较两个字符串s1和s2是否相同,若s1与s2相等,返回0,s1>s2,返回正数,s1<s2.返回负数 strcat(s1,s2) 将字符串s2连接到s1后,并返回s1. strcpy(s1,s2) 将s2复制给s1,返回s1. strncat(s1,s2,n) 将s2的前n个字符连接到s1后面,返回s1. strncpy(s1,s2,n) 将s2的前n个字符复制到s1,返回s1.
4.6.1 永远不要忘记字符串结束符null
1
2
3
4char ca[] = {'C','+','+'}; cout << strlen(ca) << endl; // 6 不正常 cout << ca <<endl; // c++** 多输出了东西
4.6.2 使用复制函数注意目标函数的空间是否足够
4.6.3 主要使用string标准库
4.7 创建动态数组
C语言使用malloc和free 开辟和释放内存
C++ 支持使用 new ,delete表达式使用
初始化:
1
2
3string *pa = new string[10]; int *pa = new int[10]();
strlen返回的是字符串的长度,并不包括字符串结束符,在获得的字符串长度必须加上1以便动态分配时预留结束符的存储空间。
指针与多维数组关系
https://blog.csdn.net/qq_36744540/article/details/79832728
最后
以上就是追寻乌冬面最近收集整理的关于第4章数组和指针的全部内容,更多相关第4章数组和指针内容请搜索靠谱客的其他文章。
发表评论 取消回复