第4章数组和指针

数组的定义和初始化
注意:
1.显示初始化数组元素
在函数体外定义的内置数组,其元素均初始化为0;
在函数体内定义的内置数组,其元素无初始化;
不管数组在哪里定义,如果其元素为类类型,则自动调用该类的默认构造函数进行初始化,如果该类没有默认构造函数,则必须为该数组的元素提供显式的初始化。

2.特殊的字符数组
字符数组在特殊的字面值的情况下,默认在数组最后一位加null

char 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指针和引用的区别

int val = 1024,int val2=2048;
int *p1=&val,*p2=&val2;
p1 = p2;    // 指针p1 指向p2

引用

int &ri = val;&ri2=val2;
ri = ri2;   // ri内存中的值替换成val2;但是ri  ,ri2引用内存中的值和原来引用方向一致

4.3.3 指向指针的指针

int val = 1024;
int *p = &val;
int **ppi = &p;

4.4 使用指针访问数组元素
c++语言中,指针和数组关系密切,特别是在表达式中使用数组名时,名字会自动转换为指向数组第一个元素的指针:
2个指针减法操作的结果是标准库类型ptrdiff_t的数据、这是signed整型。

4.4.1 解引用和指针算术操作之间的相互结果

int last = *(ia +4);   // last=ia[4];
int a = *ia +4;        // a = ia[0] + 4;

由于加法和解引用操作的优先级不同,圆括号是必须的。

4.5 指针和const 限定符
指向const 对象的指针和const指针

1.指向const 对象的指针

const double pi = 3.134;
double *ptr=π    // 编译错误:  ptr指针可能会改变pi的值,不符合const语义,所以编译错误.
const double *cptr=π  //ok

不能使用void 指针保存const对象的地址,而必须使用const void类型的指针保存const对象的地址。

const int un = 43;
const void *cpv = &un;
void *pv=&un;   // 编译错误

2.const 指针
除了指向const对象的指针外,c++还提供了const指针------本身的值不能修改:

int errnum =0;
int *const cur=&errnum;
cur = curerr;  //任何给const指针赋值都是编译错误的。

与任何const 量一样,const指针必须在定义时初始化。
指针本身是const的事实并没有说明是否能使用该指针修改它所指向的对象的值。指针所指向对象的值能否修改完全取决于该对象的类型。

3.指向const对象的const指针

const double pi = 3.14;r
const double *const pi_ptr = π

既不能修改pi_ptr所指向的对象的值,也不允许修改该指针的指向。

4.指针和typedef

typedef string *pstring;
const pstring cstr;

cstr是什么类型?错误的回答是:const pstring是一种指针,指向string类型的const对象,但这是错误的。

错的原因是:在于将typedef当做文本拓展了。声明const pstring时,const修饰的是pstring的类型,这是一个指针,因此,声明语句应该是把cstr定义为指向的string类型对象的const指针,这个定义等价为:
string *const cstr;

建议:

阅读const声明语句时容易出现错误,源于const限定符既可以放在类型前面也可以放在类型后:
string const s1;
const string s2;

typedefconst类型定义时,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结束的字符数组.

char ca1[] = {'C','+','+'};
char ca2[] = {'c','+','+','\0'};
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语言提供的标准库,

strlen(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

char 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表达式使用
初始化:

string *pa = new string[10];
int *pa = new int[10]();

strlen返回的是字符串的长度,并不包括字符串结束符,在获得的字符串长度必须加上1以便动态分配时预留结束符的存储空间。

指针与多维数组关系
https://blog.csdn.net/qq_36744540/article/details/79832728

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值