内存分区
- 堆:由程序员手动分配和释放,完全不同于数据结构中的堆,分配方式类似链表。由malloc(C)或new(C++)来分配,free(C)和delete(C++)释放。若程序员不释放,程序结束时由系统释放。
- 栈:由编译器自动分配和释放,存放函数的参数值、局部变量的值等。操作方式类似数据结构中的栈。
- 全局(静态)存储区:存放全局变量和静态变量。包括DATA段(全局初始化区)与BSS段(全局未初始化区)。其中,初始化的全局变量和静态变量存放在DATA段,未初始化的全局变量和未初始化的静态变量存放在BSS段。程序结束后由系统释放。其中BSS段的特点是:在程序执行之前自动清0,所以未初始化的全局变量与静态变量在程序执行之前已经成0了。
- 文字常量区:存放常量字符串,程序结束后由系统释放。
- 程序代码区:存放函数体的二进制代码。
数组
一维数组初始化
int x[4]={0};
int y[4]={1};
数组x和y的值为:
{0,0,0,0}, {1,0,0,0}
一维数组动态声明
当数组大小未知时,需要动态声明一维数组,格式如下:
int* a = new int[n];
当数组使用完毕,需要使用:delete []a;
释放空间。
二维数组初始化
二维数组初始化:对二维数组的所有元素都赋值,则第一维(行数)可以省略。
int array[][3]={1,2,3,4,5,6};
相当于int array[2][3]={1,2,3,4,5,6};
在声明更高纬度的数组时,只有第一维可以省略。
在C/C++中,二维数组按照航优先顺序连续存储。
二维数组动态声明
int **a = new int* [m];
for(int i=0; i<m; i++)
a[i] = new int[n];
相当于产生一个二维数组a[m][n]
。
使用后释放内存:
for(int i=0; i<m; i++)
delete []a[i];
delete []a;
二维数组的静态声明b[i][j]=b[i*n+j];
例1:将一个二维N*N矩阵顺时针旋转90°
思路:先旋转最外围一圈,然后依次旋转里层
#define N 4
void rotateArray(int matrix[][N]) {
for(int layer = 0; layer < N/2; ++layer){
int first = layer;
int last = N - 1 - layer;
for(int i = first; i < last; ++i){
int offest = i - first;
int top = matrix[first][i]; //save top
matrix[first][i] = matrix[last-offest][first]; //left -> top
matrix[last-offest][first] = matrix[last][last-offest]; //bottom -> left
matrix[last][last-offest] = matrix[i][last]; //right -> bottom
matrix[i][last] = top; //top -> right
}
}
}
int main()
{
int array[][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
rotateArray(array);
for(int i = 0; i < 16; ++i)
cout << array[i/4][i%4] << " , ";
return 0;
}
例2:数组中一个数字出现的次数超过了数组长度的一半,找出这个数字
思路:这个数字出现的次数一定大于其他全部数字出现的个数之和,用数组其他元素去抵消它一定抵消不完。 因此可以选取数组第一个为比较对象,遍历数组,比较数组元素是否为比较对象,是则次数+1,不是-1,如果次数清零则更换比较对象为当前元素。
int findMostNum(int data[], int length){
int currentAxis = data[0];
int currentNum = 0;
for(int i = 0; i < length; ++i){
if(currentNum == 0){
currentNum = 1;
currentAxis = data[i];
} else {
if(currentAxis == data[i])
currentNum++;
else
currentNum--;
}
}
return currentAxis;
}
int main()
{
int data[] = {0, 1, 2, 1, 1};
int theMostNum = findMostNum(data, 5);
cout << theMostNum << endl;
return 0;
}