文章目录
1 什么是数组
在c语言中,数组是一种构造类型,它是由基本类型数据按照一定规则组成的新类型,数组中每个值的类型必须与数组的类型相同,使用数组名和下标来唯一确定数组中的元素
2 数组的使用
我们可以想一下,如果要统计5个学生的总分是很容易的,但是如果要统计100个学生的总分将会是很麻烦的,程序很繁琐,所以我们需要用数组来解决
#include<stdio.h>
int main(){
int i;
float sum=0,score[5];
printf("输入十个学生的成绩: ");
for(i=0;i<5;i++)//i用来做下标
{
scanf("%f",&score[i]);//数组是用下标来访问的,下标是从0开始,下标不能越界
sum+=score[i];
}
printf("%f",sum);
return 0;
}
3 数组的定义和初始化
数组的定义
一维数组的定义方式:
类型说明符 数组名[常量表达式]
例如:
int arr[10];//数组名为a,有十个int型元素
double score[50*2];//数组名为score,有100个double型元素
在定义数组时需要注意的问题:
<1>常量表达式,表示的是数组元素的个数(即数组的长度),在定义时必须指定该值。
<2>引用元素时下标从零开始
<3>注意下标越界问题
<4>常量表达式中可以包含常量或常量表达式,不包含变量。
数组的初始化
int arr1[5]={1,2,3,4,5};//为全部元素赋值
int arr2[5]={1,2,3};//为部分元素赋值,后2个元素为0
int arr3[]={1,2,3};//定义并初始化,数组长度可省略
int arr4[];//不对的,单独定义数组长度不能省
4 数组在内存中的存储
#include<stdio.h>
int main() {
int arr[5] = { 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的元素个数
for (i = 0; i < sz; i++)
{
printf("&arr[%d]=%p\n", i,&arr[i]);
}
return 0;
}
代码结果如下:
仔细观察可知:
1 数组的大小可以通过计算得到
2 数组在内存中是连续存放的
5 二维数组的定义和初始化
二维数组的定义
类型说明符 数组名[常量表达式1][常量表达式2]
例如:
int[5][10]; float score[5][10];
常量表达式的规则和一维数组相同。常量表达式也可以预先定义一个名字
例如:
#define M 3
#define N 5
int a[M][N];
二维数组的初始化
int arr[3][4]={1,2,3,4,5};
int arr[][4]={{2,3},{},{4,5,6}};
二维数组可以省略行数,但是不可以省略列数
6 二维数组在内存中的存储
#include <stdio.h>
int main()
{
int arr[3][4];
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
代码结果如下:
二维数组在内存中也是连续存储的,所以跨行也是连续的。
7 冒泡排序
#include<stdio.h>
void BubbleSort(int arr[],int sz)//形参arr本质是指针
{
int i=0,j=0;
for(i=0;i<sz-1;i++)
{
int flag=1;
for(j=0;j<sz-1-i;j++)//第一趟5对比较,第二趟4对比较
{
if(arr[j]>arr[j+1])//相邻元素两两比较
{
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
flag=0;
}
}
if(flag==1)
{
break;
}
}
}
int main(){
int i=0;
int arr[6]={9,4,7,5,6,3};
int sz=sizeof(arr)/sizeof(arr[0]);//求出数组大小
BubbleSort(arr,sz);
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
8 补充
1 sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组
2 &数组名,取出的是数组的地址,表示整个数组
除了上面1,2两种情况之外,所有的数组名都表示数组首元素的地址
int arr[10]={1,2,3,4,5};
printf("%p\n",arr); //数组首元素的地址
printf("%p\n",&arr[0]);//数组首元素的地址
printf("%p\n",&arr[0]+1);//数组第二个元素的地址
printf("%d\n",arr[0]);//数组的第一个元素
printf("%p\n",&arr);//数组的地址
printf("%p\n",&arr+1);//数组末尾在后面一个的地址
printf("%d\n",*arr);//数组的第一个元素