数组
1. 声明
typeName arrayName [arraySize]
2. 初始化
- 只有在定义数组时才能使用初始化
- 不能将一个数组赋给另一个数组
- 初始化数组时,提供的值可以少于数组的元素数目。编译器把其他元素设置为零。
int cards[4] = {1 , 2};
long totals[500] = {0}; //初始化totals中所有元素为0
- [] 内为空,编译器将计算元素个数
short things[] = {1, 5, 3, 6};
C++数组初始化新增规则
- 可以省略等号
int card[4] {1, 2, 3, 4};
- 可不在打括号内包含任何东西,这将把所有元素设置为零
- 列表初始化禁止缩窄转换
long plies[] = {25, 92, 3.0} // not allowed
3.指针和数组
指针
- 指针的声明
int* p1, p2 // 创建一个指针(p1)和一个int变量(p2)
- 指针的危险
在C++中创建指针时,计算机将分配用来储存地址的内存,但不会分配用来储存指针所指向的数据的内存。
long *p;
*p = 233323; // place a value in never-never land
⚠️一定要在对指针解除引用(*p)之前,将指针初始化为一个指定的、适当的地址。
- 使用new来分配内存
typeName * pointer_name = new typeName;
new从堆(heap)或自由储存区(free store)中分配内存
C++中,值为0的指针被称为空指针(null pointer)
- 使用delete来释放内存
- delete释放指针指向的内存,但不会删除指针本身
- 不能用delete释放已释放的内存块
delete p; delete p; // not ok
- delete只能与new配对使用
int* p = &a; delete p; // not allowed, memory not allocated by new
- 对空指针使用delete是安全的
- delete用于new分配的内存,但并不意味着要使用用于new的指针,而是用于new的地址。
int *p1 = new int; int *p2 = ps; delete pq; // ok
- 使用new创建动态数组
int *p = new int[10];
delete [] p;
数组名
在多数情况下,C++将数组名视为数组的第一个元素地址。
一种例外情况是,sizeof(数组名) 将返回整个数组的长度。
指针算术
指针变量+1后,增加的量等于它指向的类型的字节数。
数组表示法 & 指针表示法
C++ 在数组表示法时,会执行如下转换:
arrayname[i] ---> *(arrayname + i)
在使用指针时,也会执行如下转换:
pointername[i] ---> *(pointername + i)
例如:
*tacos[0] 表示 *tacos
*tacos[3] 表示 *(tacos +3)
网友评论