语言基础-数组
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; }
相关文章推荐
- Java语言基础:基本数组类型
- Java语言基础--数组
- C语言基础学习8:指针数组
- C语言基础二_数组
- C语言基础:数组和字符串
- 【数据结构与算法的语言基础】数组与字符串
- c语言基础:数组、指针
- C语言基础中的一些常用数组指针程序
- C语言基础:指针类型与指针和数组、字符串的关系
- Java语言基础——数组那点事儿
- C#语言学习--基础部分(十八)数组参数
- C#语言学习--基础部分(十六)数组(2)
- 【语言基础】c++ 基本数据类型与字节数组(string,char [] )之间的转化方法
- 黑马程序员--02.Java语言基础--03.【数组】
- c语言基础--数组和指针---字符串
- C#语言学习--基础部分(十五)数组(1)
- c语言基础例题之字符数组
- c语言基础复习一之指针与数组
- 黑马程序员—Java语言基础(数组)
- java软件工程师培训学习日记------java语言核心基础之数组