1. 数组
1.1 声明与使用
声明:
数据类型 数组名[常量表达式1][常量表达式2]...;
1.2 存储与初始化
声明数组是可以给出数组元素的初值:
数组类型 数组名[] = {, , ,...};
1.3 数组作为函数参数
数组元素和数组名都可以作为函数的参数使用。使用数组名作为参数时,传递的是数组的地址,数组名即是第一个元素的指针。实参数组的长度应该不少于形参数组的长度。
1.4 对象数组
2. 指针
指针存放的是某个数据的地址。
2.1 声明
数据类型 *标识符;
2.2 运算符
“*”:获取指针所指向的变量的值。
“&”:取的某个对象的地址。
2.3 指针运算
加减运算:表示指针当前所指位置前后n个数的地址,是按存储数据类型的字节大小来运算。
*(p + n)也可以写成p[n],因此,数组名实际上就是一个不可被再次赋值的指针变量,它指向第一个数组元素,也表示数组的地址。
0用来表示空指针,也可以用NULL表示。
2.4 指针数组
形式:
数据类型 *数组名[下标表达式];
2.5 指针作为函数参数
(1)使实参与形参指向共同内存空间,可以改变实参,效果同引用。
(2)减少数据传递的开销。
(3)通过指向函数的指针传递函数代码的首地址。
2.6 指针型函数
函数的返回值是指针。
形式:
数据类型 *函数名(参数表)
{...}
2.7 指向函数的指针
函数指针就是专门用来存放函数代码首地址的变量。函数指针与函数名具有一样的作用。形式:
数据类型 (*函数指针名)(形参表);
赋值:
函数指针名 = 函数名;
2.8 对象指针
访问对象成员语法形式:
对象指针名->成员名
指向对象的非静态成员的指针:
类型说明符 类名::*指针名; //指向数据成员
类型说明符 (类名::*指针名)(参数表)
在声明之后对齐赋值:
指针名 = &类名::数据成员名;
指针名 = &类名::函数成员名;
利用指针调用成员函数:
(对象名.*类成员指针名)(参数表)
或
(对象指针名->*类成员指针名)(参数表)
指向类的静态成员的指针
对类的静态成员的访问是不依赖于对象的,因此直接用普通的1指针即可。
2.9 动态内存分配
new运算符
创建形式:
new 数据类型(初始化参数列表)
若建立的对象时一个基本变量,参数列表为其初值。
若建立的对象是某个类的实例对象,根据参数列表调用构造函数。
创建一维数组:
new 类型名[长度]; //不初始化
new 类型名[长度](); //初始化为默认值
使用new动态创建数组是可以使用变量定义数组长度的。
delete运算符
用来删除由new创建的对象。
delete 指针名;
删除数组:
delete[] 指针名;
3. vector创建动态数组
无论是静态数组还是用new创建的动态数组都难以检测下标越界的错误。vector是一个类模板。
定义形式:
#include <vector>
vector<元素类型>数组对象名(数组长度);
vector创建的是数组对象,数组对象名不是数组的首地址。
vector定义的数组对象的所有元素都会被初始化,如果是类类型将会调用默认构造函数。
也可指定初值:
vector<元素类型>数组对象名(数组长度, 元素初值);
重要成员函数:size()
4. 字符串
4.1 字符数组
可以用字符指针来存储字符串常量。
const char* STRING1 = "This is a string.";
用字符数组来存储字符串变量。
char str[8] = "program";
char str[] = "program";
4.2 string类
#include <string>
4.2.1 定义:
string str = "";
4.2.2 常用操作符
string类的操作符包括:+, =, +=, ==, !=, <, <=, >, >=, []。
s[i]只访问下标为i的字符。
4.2.3常用成员函数
//将字符串s添加在末尾
string append(const char* s);
//赋值
string assign(const char* s);
//比较大小
int compare(const char* s);
//将字符串s插入至位置p0之前
string & insert(unsigned int p0, const char* s);
//取子串
string substr(unsigned int bp0, unsigned int n) const;
//查找
unsigned int find(const basic_string &str) const;
//字符串长度
unsigned int length() const;
//交换
void swap(string &str);
4.2.3 getline()函数
getline()是头文件string定义的函数,cin读取键盘输入空格可作为间隔符,getline()则是读取一整行的数据,包括空格符。
用法:
getline(cin, s2);
getline()也可定义新的分隔符,用法是将新的分隔符作为第三个参数:
getline(cin, s2, ',');
5. 指针安全性
5.1 类型转换符
int i = 2;
floaty x = static_cast<float>(i);
float* p = reinterpret_cast<float*>(&i);
void foo(const int* cp)
{
int *p = const_cast<int *>(cp);
}
static_cast用来进行比较安全的、基于内容的基本数据类型转换。
reinterpret_cast是一种基于底层的、具有很大危险性和不确定性的数据类型转换。
const_cast用来将数据类型中的const属性去除,只适用于将常指针转化为普通指针,常引用转化为普通引用,不能用来将常对象转化为普通对象,因为转化本身就是生成一个副本。