语言基础-数组

来源:互联网 发布:短信猫群发软件 编辑:程序博客网 时间:2024/06/01 11:47

内存分区

  • 堆:由程序员手动分配和释放,完全不同于数据结构中的堆,分配方式类似链表。由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 4void 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;}
0 0
原创粉丝点击