1、指针和动态数组
指针声明并赋值:int a = 1; int* ptr = &a;
int* ptr1 = new int; 为ptr1分配int 4bytes的内存
使用new进行动态联编:
int tacos[10]; 静态联编,数组长度在编译时设置;
int *ptr = new int [size];在运行时为数组分配空间。
delete [] ptr;
2、标准数组、模板数组vector、模板数组array的运用和区别?
标准数组:type_name name[size];可以以标准括号方式进行访问、操作和赋值,存储数据分配的内存为静态内存栈,需要在编译的时候就指定数组长度,即数组长度固定。
vector数组:vector<type_name> name(size);可以以标准括号索引方式访问操作数据元素,为动态内存分配,即自由存储区堆内存。在运行的时候确定数组长度,可以动态改变数组的长度,采用new delete进行内存分配和管理,效率稍低。
array数组:与标准数组相同,数组长度固定,在编译时指定,使用栈进行静态内存分配,效率与标准数组相同,但更安全方便。相同类型和长度的array可以进行相互赋值,直接进行,而不用逐元素赋值。
示例如下,使用模板类时需包含头文件。
#include <iostream>
#include <vector>
#include <array>
using namesapce std;
int main{
// 标准数组
int ar1[3] = {1, 2, 3};
// vector数组
vector<int> ar2(3) = {4, 5, 6};
// array数组
array<int, 3> ar3;
ar3[0] = 7;
ar3[1] = 8;
ar3[2] = 9;
// array 赋值
array<int, 3> ar4;
ar4 = ar3;
ar1[-3] = 12;
cout << ar1[-3] << " ar1[-3] at " << &ar1[-3] << endl;
cout << ar3[2] << &ar3[2] << endl;
cout << ar4[2] << &ar4[2] << endl;
}
特殊索引赋值:在c++中,超出数组索引范围的赋值语句相当于指针的移位赋值操作,如例子中ar1[-3] = 12;相当于*(ar1 - 3) = 12;这种操作十分不安全,可能对内存中其它重要的内存块产生影响。这与python中的赋值索引大不相同,python中赋值索引代表着数组中倒序的位置,如a[-1]表示数组a中的末尾元素。