1. 数组介绍
C语言的数组是一个同类型数据的集合,主要用来存储一堆同类型的数据。
程序里怎么区分是数组?[ ]
这个括号是数组专用的符号. 定义数组、 访问数组数据都会用到。
数组的定义语法:
int data[10]; <数据类型> <数据名称>[常量-整数-数据数量];
定义一个int类型的数组,数组的名称是data,长度是10,所占空间大小:4*10 字节。
特点:
1. 访问数组成员的时候:下标是从0开始的。int data[10]; 下标 (0~9)
2. 数组只是支持在定义的时候进行整体赋值。
3. 数组定义的时候,[]里只能填常量。数组在定义之后就无法更改大小。
4. 数组的空间是连续的—内存。
5. 数组的名称就是数组空间的首地址。
6. 数组初始化时,如果没有赋值,那么数组空间里的数据是未知的---局部变量。
7. 数组初始化时,只要给一个空间赋值,剩余空间都自动初始化为0---局部变量。
数组练习1: 定义一个数组、打印出数组里的数据
#include <stdio.h>
int main()
{
char i;
int data[10]={12,13,14,15}; //下标
int a[5];
for(i=0;i<10;i++) //0~9
{
printf("data[%d]=%d\n",i,data[i]);
}
for(i=0;i<5;i++) //0~4
{
printf("a[%d]=%d\n",i,a[i]);
}
return 0;
}
数组练习2: 从键盘上读取5个数据存放到数组里,在顺序打印、逆序打印
#include <stdio.h>
int main()
{
int i;
int data[5]={0}; //下标
//从键盘上读取5个数据存放到数组里
printf("请输入5个数据:");
for(i=0;i<5;i++)
{
scanf("%d",&data[i]); //两种: 空格 、 回车-换行
}
for(i=0;i<5;i++)
{
printf("data[%d]=%d\n",i,data[i]);
}
for(i=4;i>=0;i--)
{
printf("data[%d]=%d\n",i,data[i]);
}
return 0;
}
2. 数组定义语法与注意事项
1. 数组的名称是数组元素的首地址。(数组的名字就是地址)
2. 数组只能在初始化的时候进行整体赋值。比如: int a[100]={10,20,30};
3. 数组的下标访问是从0开始的。比如: int a[10]; 下标范围: a[0] ~ a[9]
4. 数组名称虽然是地址,但是这个地址是不能偏移、也不能自增自减,也不能改变指向。
int a[10];
int b[10];
a++、a--; //错误的
a=b; //错误的
a[0]=b[0]; // 正确
5. 如果数组是局部变量,初始化没有赋值的情况下,成员是随机值。
比如: int a[10]; printf("%d\n",a[0]);
初始化的时给数组进行赋值,那么没有赋值的下标是什么值?
比如: int a[10]={1,2,3}; printf("%d\n",a[6]); //0
6. 数组定义的时候(C89), 数组的下标里的大小只能填常量。
比如:
int a[]; //错误的,定义数组必须填大小
int size=10; int a[size]; //错误的,定义数组只能填常量。
int b[100]; //正确
#define SIZE 100 int a[SIZE]; //正确
3. 案例: 计算平均值
要求: 定义数组,从键盘上录入5个浮点类型数据存放到数组,计算平均值和最大、最小值,输出到屏幕上。
#include <stdio.h>
int main()
{
int i;
float sum=0;
float data[5];
float max=0;
float min=100;
printf("请输入5个数据:");
/*1. 输入数据*/
for(i=0;i<5;i++)
{
scanf("%f",&data[i]);
}
/*2. 处理数据*/
for(i=0;i<5;i++)
{
sum+=data[i]; //累加
if(data[i]>max)max=data[i];
if(data[i]<min)min=data[i];
}
printf("平均值:%.1f\n",sum/5.0);
printf("最大值:%.1f\n",max);
printf("最小值:%.1f\n",min);
return 0;
}
4. 案例: 求和
要求: 定义数组,从键盘上录入5个整数数据,求和,输出结果。
#include <stdio.h>
int main()
{
int i;
int sum=0;
int data[5];
printf("请输入5个数据:");
/*1. 输入数据*/
for(i=0;i<5;i++)
{
scanf("%d",&data[i]);
}
/*2. 处理数据*/
for(i=0;i<5;i++)
{
sum+=data[i]; //累加
}
printf("和:%d\n",sum);
return 0;
}
5. 案例: 判断数据范围
要求: 定义数组,从键盘上录入10个整数数据,计算里面大于5、大于10数据的数量,输出结果。
#include <stdio.h>
int main()
{
int i;
int data[10];
int cnt_10=0,cnt_5=0;
printf("请输入10个数据:");
for(i=0;i<10;i++)
{
scanf("%d",&data[i]);
}
//处理数据
for(i=0;i<10;i++)
{
if(data[i]>5)cnt_5++;
if(data[i]>10)cnt_10++;
}
printf("cnt_5=%d\n",cnt_5);
printf("cnt_10=%d\n",cnt_10);
return 0;
}
6. 案例: 冒泡排序-整数数组
从键盘上录入10个数据,进行冒泡排序. 大到小排序。
#include<stdio.h>
int main()
{
//从键盘上录入5个数据,进行冒泡排序. 大到小排序。
int a[5];
int i,j;
int tmp;
printf("录入5个数据:");
for(i=0;i<5;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<sizeof(a)/sizeof(a[0])-1;i++) //排序次数
{
for(j=0;j<sizeof(a)/sizeof(a[0])-1-i;j++) //排序的过程
{
if(a[j]>a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
7. 字符串数组
7.1 字符串特点
1. 字符串本身就是字符数组。比如:char a[10]="123";
2. 常规字符串使用双引号括起来的。 比如:char a[10]="123";
3. 字符串以'\0' 作为结束符号。
4. 字符数组一定是字符串? 不一定。 比如: char a[]={12,3,4,5,5};
7.2 字符串定义
#include<stdio.h>
int main()
{
char buff1[10]={'1','2','3','\0','4','5','6','\0','7'};
char buff2[]={'1','2','3','\0'};
char buff3[]="123";
printf("%d\n",sizeof(buff2)); //4
printf("%d\n",sizeof(buff3)); //4
return 0;
}
7.3 计算字符串长度
#include <stdio.h>
#include <string.h>
int main()
{
char buff[100];
int cnt=0;
printf("请键盘上录入字符串:");
scanf("%s",buff); // 不可以录入空格
while(buff[cnt]!='\0')
{
cnt++;
}
printf("cnt=%d\n",cnt);
return 0;
}