您的位置:首页 > 其它

语言基础-数组

2017-04-14 20:38 162 查看

内存分区

堆:由程序员手动分配和释放,完全不同于数据结构中的堆,分配方式类似链表。由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
;

当数组使用完毕,需要使用:
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
;


相当于产生一个二维数组
a[m]


使用后释放内存:

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[]
) {
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: