数组
-
初始化规则
int cards[4] = {1, 2, 3, 4}; //okay int hand[4]; // okay hand[4] = {1, 2, 3, 4} // not allowed hand = cards; // not allowed, 不允许静态数组相互赋值,必须单个单个赋值。可使用array取代 short things[500] = {1} // 只有第0个元素为1,其他都为0
字符串
-
sizeof和strlen
sizeof(a) //得出字节(byte)数 strlen // 返回字符数量,末尾的'\0'不计算在内
-
字符串拼接
如果字符串过长,可以使用两个“”进行字符串拼接
char str1[] == "AA""BB"; cout << sizeof(str1) <<endl; // 5
-
string类
#incluede <string> string str1; string str2 = "ss"; //string定义的字符串可以自动调整大小,可以动态变化,并且可以使用运算符拼接。 str1 = str2 + str1;
结构体
//声明
struct inflatable
{
char name;
} in, *p;
//访问
in.name;
p->name;
(*p).name;
NOTE
- 如果结构标识符是结构名,则使用句点运算符;
- 如果结构标识符是指向结构的指针,则使用箭头运算符。
共用体
union id
{
int i;
double g;
}
//匿名共用体
struct te
{
int name;
union
{
int i;
double g;
}
} tei;
// 访问
tei.i = 1;
//普通共用体
struct te
{
int name;
union id
{
int i;
double g;
}
} tei;
// 访问
tei.id.i = 1;
enum 枚举
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet}
指针
// & 取地址运算符
// * 解除引用运算符
-
使用new 分配内存 / 使用delete释放内存
new/delete 操作的是**堆(heap)**空间
// 创建数据对象指针 int* p = new int; delete p; // 创建动态数组 int* p = new int[5]; delete [] p;
遵循的原则: 1. 不要使用delete来释放不是new分配的内存 2. 不要使用delete释放同一个内存块两次 3. 如果使用new[]为数组分配内存,则应该使用delete[]来释放 4. 如果使用new,则应该使用delete释放 5. 对空指针应用delete是安全的
-
指针、数组和指针算术
在多数情况下,C++将数组名解释为数组的第一个元素的地址。因此可以直接使用地址[索引]访问数组。
NOTE
double wages[3] = {1.0, 2.0, 3.0}; double* pw = wages; cout << sizeof(wages) << " = size of wages array" << endl; cout << sizeof(pw) << " = size of pw pointer\n"; // 得到结果如下: //24 = size of wages array 整个数组的大小 //8 = size of pw pointer 指针变量的大小 //对于char数组 const char* str1 = "here"; char str2[] = "here"; cout << strlen(str1) << endl; cout << strlen(str2) << endl; cout << sizeof(str1) << endl; cout << sizeof(str2) << endl; //结果 // 4 // 4 // 8 // 5
上面对数组名和数组指针使用sizeof时得到的值不同,因为对数组名使用sizeof得到的是数组的长度,对指针应用sizeof得到的指针的长度。所以在double类型指针的结果中,对wage应用sizeof就是24byte,对pw应用sizeof就是8byte;在char类型的指针测试结果中,strlen函数因为以‘\0’为结束,所以结果相同,而sizeof对str1的结果是因为const指针为8byte,C++中“here”为常量字符串,必须为const指针类型指向内存或用数组保存。
数组的替代品,vector和array都是数组,都可以按照数组的方式访问
-
vector模板类-动态数组的替代品, 使用堆存储
#include <vector> using namespace std; vector<int> vi; // create a zero-size array of int vector<double> vd(n); // create an array of n doubles
-
array模板类- 静态数组的替代品, 使用栈存储
#include <array> using namespace std; array<int, 6> ai; array<int, 3> ad = {1, 2, 3}; // 与普通数组用法相同
NOTE
-
无论数组、vector对象或者array对象,都可以使用标准数组表示法来访问各个元素,例如a[0]
-
array对象和数组存储在相同的内存区域-栈中,而vector对象存储在堆中
-
array对象与数组不同的地方在于,一个array对象可以直接复制给另一个array对象,而标准数组不允许,必须单个值拷贝。
array<int, 10> ar1; array<int, 10> ar2={1,1,2}; ar1 = ar2; // allowed! int a[10]; int b[10] = {1,1,2}; a = b; // not allowed;
-
stl的数组可以避免索引越界,但仅在使用a.**at(-2)**成员函数时才有效,效率对比a[-2]要低一些。