C 语言 - 数组
作者:DS小龙哥
- 2022 年 1 月 11 日
本文字数:2559 字
阅读完需:约 8 分钟
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;
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 2
版权声明: 本文为 InfoQ 作者【DS小龙哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/781f2f2960032b11a7d9b773c】。文章转载请联系作者。
DS小龙哥
关注
之所以觉得累,是因为说的比做的多。 2022.01.06 加入
熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域
评论