一、数组的基本概念与应用场景
1.数组的定义与本质
数组是由相同数据类型的元素组成的有序集合,通过数组名和下标访问每个元素。
1.数组在内存中占据连续的存储单元,数组名代表首元素的内存地址。
2.普通变量存储单个数据(如int a),而数组可存储批量数据(如int a[10]表示 10 个整型元素)。
二、一维数组的定义与使用
1.定义方式
数据类型 数组名[元素个数]
1.示例:
int nums[10];:定义包含 10 个整型元素的数组,下标范围 0~9。
char letters[26];:定义包含 26 个字符型元素的数组,存储 26 个英文字母。
2.注意事项:
元素个数必须是常量(如#define N 5; int arr[N];),不能是变量(如int n=5; int arr[n];在 C99 前不合法)。
数组名遵循标识符规则(字母、数字、下划线,不能以数字开头)。
2.初始化方式
1.全部元素赋值:
int arr[3] = {10, 20, 30};(等价于arr[0]=10, arr[1]=20, arr[2]=30)。
2.部分元素赋值:
int arr[5] = {1, 2};(arr[0]=1, arr[1]=2, arr[2]=0, arr[3]=0, arr[4]=0)。
3.初始化为 0
int arr[5] = {0};(仅第一个元素显式赋值 0,其余自动补 0)。
int arr[5] = {0,0,0,0,0};(显式初始化所有元素为 0)。
4.省略长度初始化
int arr[] = {1,2,3};(等价于int arr[3] = {1,2,3};。
3.练习示例
1.数组逆序输出
代码示例
#include <stdio.h>
int main()
{
int a[10];
printf("数组为:");
for(int i=0;i<10;i++)
{
a[i]=i;
printf("%d ",a[i]);
}
printf("\n逆序为:");
for(int i=9;i>=0;i--)
{
printf("%d ",a[i]);
}
return 0;
}
2.斐波那契数列
定义:前两项为 1,从第三项开始每一项等于前两项之和(1, 1, 2, 3, 5, 8…)。
代码示例
#include <stdio.h>
int main()
{
int arr[25];
int size,i;
arr[0]=0;
arr[1]=1;
size=sizeof(arr)/sizeof(arr[0]);
for(i=2;i<size;i++)
{
arr[i]=arr[i-1]+arr[i-2];
}
for(i=0;i<size;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
3.排序算法(顺、逆序)
冒泡排序(升序):相邻元素比较,大的往后移,每次将最大元素 “冒泡” 到末尾。
代码示例
#include <stdio.h>
int main()
{
int a[]={43,2,65,2,5454,23,78,3,4,679,21};
int len,tmp;
len=sizeof(a)/sizeof(a[0]);
for(int i=0;i<len-1;i++)
{
for(int j=0;j<len-1-i;j++)
{
if(a[j] < a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
printf("数长为: %d\n",len);
printf("逆序为:\n");
for(int k=0;k<len;k++)
{
printf("%d ",a[k]);
}
printf("\n顺序为:\n");
for(int m=len;m>=0;m--)
{
printf("%d ",a[m]);
}
return 0;
}
三、二维数组的定义与使用
1.定义与场景
二维数组是 “数组的数组”,用于表示具有行列结构的数据。
数据类型 数组名[行数][列数]
int matrix[3][4];:3 行 4 列的整型数组,共 12 个元素。
float table[5][2];:5 行 2 列的浮点型数组,可存储 5 组 (x,y) 坐标。
2.初始化方式
1.按行列初始化
数据类型 数组名[行数][列数] = {{行1值}, {行2值}, …};
int arr[2][3] = {{1,2,3}, {4,5,6}};
2.省略行数初始化
必须指定列数,行数由初始化数据的个数决定。
int arr[][3] = {{1,2}, {4,5}, {7,8}};(等价于 3 行 3 列数组,未赋值元素为 0)。
3.部分元素赋值
未赋值元素自动初始化为 0。
int arr[2][3] = {{1}, {4,5}};
3.练习示例
1.二维数组找最大值
问题描述:在 m×n 的二维数组中找到最大值及其位置。
代码实现
#include <stdio.h>
int main()
{
int i,j;
int hang,lie,max;
int arry[3][4]={1,12,23,84,15,116,347,68,99,110,131,121};
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d\t",arry[i][j]);
}
printf("\n");
}
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(max < arry[i][j])
{
max=arry[i][j];
hang=i;
lie=j;
}
}
}
printf("数组中最大值为:%d,它在第%d行,第%d列\n",max,hang,lie);
return 0;
}