数组的概述
具有相同类型的变量 用连续的空间储存起来 这样的数据结构 就是数组
数组属于 构造数据类型
数值数组 int a[10]
字符数组 char s[10]
指针数组 char *p[10]
结构数组等....等等,暂时初步了解即可
数组的分类
- int a[10] = {1,2,3,4,5,6};
- int b[4][2] = { {1,2},{3,4},{5,6},{7,8} };
- char string[8] = {'a','b','c'};
- char *q[10] = { &a[0],&a[1],&a[2] };
- struct student boy[5];
- int (*sum[10])(int x,int y);
数值数组:
1.一维数值数组:
short a[10];
int b[10];
long c[10];
float b[10];
double e[10];
2.二维数值数组
int a[2][3] = { {80,75,78},{61,65,99} };
float b[2][3] = { {80.5,75.5,78.5},{61.5,65.5,99.5} };
一维数值数组 1.数组的定义
需求:请定义一个数组,该数组有10个元素 每个元素为int类型
在定义的时候:
- arr[] arr和[]结合是数组
- 将确定的元素的个数放入中括号中
- 用元素的类型 定义一个普通变量
- 从上往下整体替换。
请定义一个数组,该数组 有10个袁术 每个元素为地址 每个地址int类型变量的地址:
完成后:int *arr[10];
int arr[10];
注意:
- 数组名 arr不能和其他变量名同名
- 数组的元素小标是从0开始:0~9
- 数组的元素分别是:arr[0]、arr[1]....arr[9],如果访问arr[10]数组越界
- 数组的元素 等价于 普通变量
- 在定义数组的时候 [] 里面的值 不能是变量。(C89不支持 C99支持变量 要考虑移植性,尽量别使用变量)
案例:遍历数组
#include<stdio.h>
void test01()
{
int arr[10];//局部数组,如果不初始化,内容不确定
int i = 0;
//遍历数组
for(i=0;i<10;i++)
{
printf("%d\n",arr);
}
}
int main(int argc,char *argv[])
{
test01();
return 0;
}
运行结果:
-858993460
-858993460
-858993460
-858993460
-858993460
-858993460
-858993460
-858993460
-858993460
-858993460
Press any key to continue
案例:数组的初始化
初始化:定义的时候 给变量 或 数组元素 赋值的动作叫初始化。
全部初始化:
int arr[5] = {10,20,30,40,50};
//如果是 全部初始化 数组元素的个数 可能省略 实际的元素个数由 初始化个数确定
int arr[] = {10,20,30,40,50} //少用
//错误演示
int arr[];//错误,无法确定数组的大小
部分初始化:(重要)
//部分初始化 未被初始化的部分自动补0
int arr[5] = {10,20,30};
//初始化数组 常见操作(将数组的所有元素清零)
int arr[5] = {0};//只初始化arr[0] = 0,未被初始化的部分自动补0
int arr[5] = {2};// 2 0 0 0 0
扩展-特殊初始化:
//了解即可
int arr[5] = {[2]=3,[4]=7}; // 0 0 3 0 7
//[2]=3将数组的第2个元素 初始化为3
//[4]=7将数组的第4个元素 初始化为7
//部分编译器不支持这种写法!
数组的空间大小:
#include<stdio.h>
void test02()
{
//arr数组名 作为数组类型 代表的是数组空间的总大小
int arr[5] = {10,20,30,40,50};
int n = 0;
//数组的总大小 = 元素的个数 * 每个元素的大小 = 4*5=20
printf("数组的总大小=%d\n",sizeof(arr)); //20字节
//数组元素的大小 arr[0]代表数组的第0个元素
printf("数组元素的大=%d\n",sizeof(arr[0])); //4字节
//数组元素的个数 = 数组的总大小 / 每个元素的大小
n = sizeof(arr)/sizeof(arr[0]);
printf("数组元素的个数为:%d\n",n);
}
int main(int argc,char *argv[])
{
test02();
return 0;
}
案例:
#include<stdio.h>
void test03()
{
int arr[] = {10,20,30,40,50,1,2,3};
int n = sizeof(arr)/sizeof(arr[0]);
int i = 0;
//遍历数组
for(i=0;i<n;i++)
{
printf("%d ",arr);
}
printf("\n");
}
int main(int argc,char *argv[])
{
test03();
return 0;
}
运行结果:
10 20 30 40 50 1 2 3
Press any key to continue
案例:
#include<stdio.h>
void test05()
{
int arr1[5] = {1,2,3}; //20
int arr2[] = {1,2,3}; //12
char arr3[5] = {1,2,3}; //5
int arr4[] = {[5]=7}; //24 VC++6.0不支持
printf(" %d\n %d\n %d\n %d\n",sizeof(arr1),sizeof(arr2),sizeof(arr3),sizeof(arr4));
}
int main(int argc,char *argv[])
{
test05();
return 0;
}
数组元素的操作
数组的元素 等价于 普通变量
#include<stdio.h>
void test01()
{
int arr[5] = {1,2,3,4,5};
int n = sizeof(arr)/sizeof(arr[0]);
int i = 0;
//给数组元素赋值
arr[0] = 10;
arr[1]++; //arr[1] = arr[1] + 1;
for(i=0;i<n;i++)
{
printf("%d\n",arr[i]);
}
}
int main(int argc,char *argv[])
{
test01();
return 0;
}
案例:
定义数组 5个袁术 每个元素int类型 获取键盘输入
#include<stdio.h>
void test02()
{
//数值数组 只能逐个元素操作 不能整体操作
int arr[5] = {0};
int n = sizeof(arr)/sizeof(arr[0]);
int i = 0;
printf("请输入%d个int数据\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);//&arr[i] 表示取第i个元素的地址
}
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);//arr[i] 访问数组的第i个元素
}
}
int main(int argc,char *argv[])
{
test02();
return 0;
}
作业:
定义数组 5个元素 每个元素int类型 获取键盘输入 请求出数组的最大值\最小值\平均值.
#include<stdio.h>
void test03()
{
int arr[5] = {0};
int n = sizeof(arr)/sizeof(arr[0]);
int i = 0;
int minnum = 0;//最小值
int maxnum = 0;//最大值
float average = 0;//平均值
printf("请输入%d个int数据:\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
minnum = arr[0];
for(i=0;i<n;i++)
{
//求最大值
if (maxnum < arr[i] )
maxnum = arr[i];
//求最小值
if(arr[i] < minnum )
minnum = arr[i];
//求平均值
average = average + arr[i];
}
printf("最大值:%d\n",maxnum);
printf("最小值:%d\n",minnum);
printf("平均值:%.2f\n",average/n); //// 打印平均值,保留两位小数
}
int main(int argc,char *argv[])
{
test03();
return 0;
}
|