语言基础-数组
来源:互联网 发布:短信猫群发软件 编辑:程序博客网 时间: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
- C语言基础:数组
- C语言-数组基础
- 语言基础-数组
- C语言基础之数组
- c语言基础:数组、指针
- C语言基础:二维数组
- C语言基础之数组
- C语言基础C02数组
- C语言基础-二维数组
- java语言基础06数组
- java语言基础07数组
- Java语言基础-7.数组
- JavaScript语言基础---(四)数组
- jsp语言基础5--数组
- C语言基础之数组
- c语言基础--数组指针
- C语言基础之数组
- C语言基础 6 数组
- 深入理解C语言中的.h文件和.c文件
- 【C#】学习笔记不拉不拉
- docker pure-ftp 搭建ftp服务器
- 第八周
- Fragment(碎片)介绍及用法
- 语言基础-数组
- Shell Basic Examples
- 机器学习实战第二章K近邻算法照葫芦画瓢实践。
- mybatis与Hibernate的区别
- 镜面反射辐照模型——不完全的翻译
- Windows Server AppFabric 缓存(微软分布式缓存解决方案)
- 使用crunch生成密码字典
- 网络协议(三)UDP
- Java sdut acm 3870 判定Java源文件名称