week two(标准库类型+指针和引用)

一、标准库类型string

1.1
string 表示可变长度的字符序列。字符串是对象。
string 类支持字符串对象的各种操作:
(1)各种初始化方式
(2)字符串之间的复制、比较、连接
(3)查询字符串长度和判断字符串是否为空
(4)访问字符串中的单个字符
使用string 类要包含头文件 < string >

1.2
string s1, s2; //创建两个空字符串对象
string s3 = “Hello, World!”;
string s4("I am ");
两种初始化方法
s1 = s3 + " " + s4; //字符串连接
s1 += " 5 "; //末尾追加
cout << s1 + s2 + “!” <<endl; //输出字符串内容
cout <<“Length of s1 is :” << s1.size() << endl;//字符串长度
for (size_t i = 0; i < s1.size(); ++i) //逐个输出s1中的字符
cout << s1[i] <<" ";//可以作为数组使用

1.3
C++也可以使用键盘输入,但是遇见空格或回车就结束。
解决:getline()函数(每次读取一行文本直到文件结束,回车表示输入结束)
string line;
while(getline(cin,line))
cout<<line<<endl;

1.4
输入直到回车或是无效输入(例:Ctrl+C)结束,每按一次空格表示一个数据。
string word;
while(cin>>word)
cout<<word<<endl;

1.5
**empty()**函数判断string对象是否为空。
每次读取一行文本,输出非空的行。
string line;
while(getline(cin,line))
if(!line.empty()) //line不为空,输出
cout<<line<<endl;

1.6
string 对象和C风格字符串
可以将C风格的字符串直接赋给string对象,反之不可

c_str()操作
用string对象的c_str()操作可以返回一个表示该string对象内容的C风格字符串,结果为const char*类型,即C风格字符串的首地址。
string s1=“hello”;
x=strlen(s1.c_str());

.
.

二、指针和引用

2.1内存地址
(1)程序运行时,代码和需要的数据都被存储在内存中。
(2)内存是有序的字节序列,每个字节都有唯一的地址,使用该地址可以确定字节的位置,用以存储和获取数据。

2.2直接访问和间接访问
(1)通过变量的名字直接访问为程序中定义的变量分配的内存单元,存取变量的值。
(2)使用变量的内存地址找到存放数据的单元,间接访问其中的内容(指针实现)。

2.2.1 指针(指针变量存储目标对象在内存中的位置)
通过指针可以间接操纵它指向的对象
指针变量本身数据类型默认:32位无符号整数
定义格式:
类型 * 指针变量;(这里类型是指指针变量指向的简单变量的类型)
指针的类型指出了该内存地址保存的内容,以及该内存区域有多大(不同类型的所占字节数不同)
在这里插入图片描述

指向一个对象的指针有两个存储单元与之相关:
一个是指针自己的存储单元;另一个就是指针指向的对象的存储单元,里面存放该对象的值。
可以定义指针自己的存储单元(2级指针**)
int ival = 1024;
int * pi = &ival;
int ** ppi = & pi; //ppi是指针的指针,存放pi的地址

在这里插入图片描述

2.2.2取地址运算符“&”
指针存放指定类型对象的地址,要获取对象的地址,使用取地址运算符“&”
int ival=120;
int * pi = & ival ;

// pi存放int变量ival的地址
// 或者说pi指向ival
char ch = ‘a’, * pc = &ch;
// pc指向字符型变量ch

int x = 100, y = 20;
int * pi = & x; * pi= y;

(*pi等于X,pi不指向Y。)
// 间接操作pi指向的x,即x = y

在这里插入图片描述
2.2.3 空指针
表示空指针的2种方法:
int * p1 = 0;
int * p2 = NULL;
//头文件< cstdlib >

2.2.4使用指针的注意事项
(1)定义指针时,应该对指针进行初始化;
(2)指针的运算:
同类型的指针可以进行相等(==)或不相等(!=)的比较操作,比较的结果是布尔类型
指针可以进行
加或减整数值
的算术运算
自增、自减运算适用于指向数组元素的指针

2.2.5指针的应用
(1)构建链式的数据结构,如链表和树;
(2)管理程序运行时动态分配的对象;
(3)作为函数的参数。

2.2.6存储空间分配策略

静态(编译时)分配空间:
编译器在处理程序源代码时分配内存;
效率高,灵活性差,运行前就要知道程序需要的内存大小和类型。
动态(运行时)分配空间:
程序运行时调用运行时刻库函数来分配内存;
占用程序运行时间,更灵活。

静态和动态内存分配在语法上的主要区别:
静态对象是有名字的变量,可以直接对其进行操作;动态对象没有名字,要通过指针间接地对它进行操作。
静态对象的空间分配与释放由编译器自动处理,动态对象的空间分配与释放必须由程序员显式地管理。

2.2.7动态内存管理方法:
C++通过new和delete运算符进行动态存储空间的管理

2.2.7.1 new 运算符
上动态分配空间,创建对象,并返回对象的地址
一般将new返回的地址保存在指针变量中,以便间接访问堆上的对象。

new表达式的三种形式:
(1)分配单个对象:new 类型 或者 new 类型(初始值)
int*ip1 = new int;
//在堆上分配一个int类型的对象,返回它的地址
*ip1 = 512;

int * ip2 = new int(100);
//在堆上分配一个int对象,
//初始化为100,返回其地址
//堆上分配的这个对象只能通过指针间接操作

在这里插入图片描述
(2)分配多个连续存储的对象:new 类型[数组大小]
int * ipa = new int[100];
//在堆上分配一个大小为100的int数组并返回数组的首地址
注意:
1、不能对数组进行显式的 初始化 (已经分配大小)
2、数组大小不必是常量,是数组元素的个数,不是字节数
3、用new分配数组时,并未得到一个数组类型的对象,而是得到一个数组元素类型的指针

在这里插入图片描述

2.2.7.2 delete 运算符
堆上的空间在使用后必须释放,否则会造成内存泄漏
即动态内存空间使用后未回收,导致一直被占据

(1)释放new分配的单个对象的delete形式: delete 指针;
int* ip = new int;
//不再使用这个int对象时,释放内存
delete ip;
//释放指针指向的int对象,将空间归还给动态存储区
(2)释放new分配的数组的delete形式: delete[] 指针;
int* pa = new int[100];
… //不再使用这个数组时,释放内存
delete[] pa
//释放指针pa指向的数组,将空间归还给动态存储区
(3)释放后(空悬指针,指向不确定的单元)只是之间的指向关系没有了,指针变量和数据仍然存在,并且不可以再对释放后的指针变量做任何操作。

.
.

2.3 引用 ( 比较安全 )
(1)引用必须被初始化,初始值是一个有内存地址的对象,不能与字面值或某个表达式的计算结果绑定在一起。
(2)一般在初始化变量时,初始值会被复制到新建的对象中
定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用
(3)引用一旦初始化,就不能再指向其他的对象,对引用的所有操作都会被应用在它所指向的对象上
(4)引用并非对象,是为已存在的对象所起的另一个名字
在这里插入图片描述

2.4 const限定指针
(1)const type * cp; type const * cp;
cp指向常量,cp可以更改指向。

在这里插入图片描述

C++允许将一个非const地址赋值给const指针
在这里插入图片描述
(2)type * const cp
cp 的指向是固定的,指向可以改变的非const对象。
(3)const type * const cp
指向const对象的const指针。
在pi的定义中:
第一个const限定int,表示指针指向的单元是常量;
第二个const限定pi,表示指针的值也是一个常量
指针pi所在内存的值不允许改变,它所指向内存的值也不能改变

2.5 const 限定引用
const引用可以绑定到const对象
不能用非const引用指向const对象
在这里插入图片描述
const引用不能用来修改它所绑定的对象
在这里插入图片描述
可以用任意表达式初始化const引用,只要表达式的结果能转换成引用的类型即可在这里插入图片描述
const引用仅对引用自己可参与的操作进行了限定,对所指向的对象本身是不是常量未作限定。因为指向的对象也可能不是const,所以允许通过其他途径改变它的值
在这里插入图片描述

2.6 数组等价指针
a[i]= * (a+i);
p=a;
p[i]=a[i];
p[i]= * (p+i);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值