- 为什么需要数组
为了解决大量同类型数据的存储和使用的问题
(定义n多个不同的变量名,累死;)
为了模拟现实世界
数组的分类:
- 一维数组(线)
- 为元素分配连续的内存空间
- 所有的数据类型必须相同
- 所有变量所占的字节大小必须相等
- 有关一维数组的操作
(1)初始化:- 完全初始化:int a[5] = {1, 2, 3, 4, 5};5
- 部分初始化:int a[5] = {1,2,3}; 未初始化的部分自动为零
- 不初始化:int a[5]; 所有元素都是垃圾值
- 清零:int a[5] = 0;
- 错误写法:
int a[5];
a[5] = {1,2,3,4,5};
错误,5是下标。只有在定义数组的时候才能整体赋值,其他情况下的整体赋值都是错误的。
正确写法:
for(int i = 0; i < 5; i++)
b[i] = a[i];
如何将数组a的值全部赋值给数组b?
错误写法:
b = a;
a和b代表数组名,代表数组第一个元素地址:即a[0]地址和 b[0]地址
#include <stdio.h>
int main(void) {
int a[5];
scanf("%d", &a[0]);
printf("a[0] = %d\n", a[0]);
scanf("%d", &a[3]);
printf("a[3] = %d\n", a[3]);
for(int i =0; i < 5; i++)
printf("%d ", a[i]);
return 0;
}
------------------结果-------------------------
123
a[0] = 123
456
a[3] = 456
123 -858993460 -858993460 456 -858993460
------------------------------------------------
反转数组中的数据:
#include <stdio.h>
int main(void) {
int a[7] = {1,2,3,4,5,6,7};
int i = 0;
int j = 6;
int t;
while(i < j) {
t = a[i];
a[i] = a[j];
a[j] = t;
i++;
j--;
}
for( i =0; i < 7; i++)
printf("%d ", a[i]);
return 0;
}
赋值、排序、求最大值、最小值、求个数
- 二维数组:平面
int a[3][4];
总共是3行4列12个元素,
a[0][0] ~ a[2][3]
a[i][j] ,该二维数组的下标只能为:a[i-1][j-1]
初始化:
- int a[3][4] = {1,2,3,4,5,6,7,9,10,11,12};
- int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
for(int i = 0; i < 3, i++)
for(int j = 0; j < 4; j++)
printf("%-5d ", a[i][j]); //负号表示左对齐,5表示5个光标位置
printf("\n");
对二维数组的排序
求每一行最大值
判断矩阵是否对称
矩阵的相乘
- 三维数组:空间几何
- 四维数组:时间,时空穿越
- 多维数组
是否存在多维数组?
不存在
因为内存是线性一维的。
n维数组可以当做是每个元素是n-1维数组的一维数组。
比如:
int[3][4]
该数组是含有3个元素的一维数组
只不过每个元素又是一个含有4个元素的一维数组
int[3][4][5]
该数组是含有3个元素的一维数组
只不过每个元素都是4行5列的二维数组
....
#include <stdio.h>
int main(void){
int a[5] = {1,2,3,4,5};
for(int i = 0; i < 5; i++)
printf("%d\n",a[i]);
printf("%d\n", a[100]); //有值有结果,但是是脏数据,非数组的数据
}
数组不是重点,因为数组太原始太底层了,排序啊,插入啊,啥的都需要自己编写。现在的编程语言都已经提供了这样的工具类。以数组为底层,你操作起来很简单实用,不麻烦。所以数组一般很少用。
数组的限制
1.数组的长度不能通过变量的形式指定
int a[5]; //OK
int lent = 5; int a[len]; /error
- 传统形式定义的数组,该数组内程序员无法手动释放
在一个函数运行期间,系统为该函数中的数组分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放 - 数组的长度一旦定义,其长度不能更改。
数组的长度不能再函数运行过程中动态地扩充或缩小 - 传统方式定义的数组不能跨函数使用
A函数定义的数组,在A函数运行期间可以被其他函数调用,但A函数运行完毕之后,A函数的中的数组将无法被其他函数调用
#include <stdio.h>
int main(void) {
int arr[] = {3, 5, 8,2,54, 9,7};
int *p = arr;
int len = sizeof(arr) / sizeof(int);
for(int i = 0; i < len; i++){
//printf("%d " , *(arr+i));
//printf("%d ", arr[i]);
//printf("%d ", *(p+i));
//printf("%d ", p[i]);
//printf("%d ", *p++);
printf("%d ", *(p++));
//printf("%d ", arr++);//arr是常量,++会改变其值,❌
}
printf("\n");
}
网友评论