数组定义:
类型说明符 数组名[常量表达式]
(1) (2) (3)
数组特点:
1.单一性 //数组中元素的类型都是一样的
2.连续性 //数组开辟的是一块连续的内存空间
3.有序性 //元素间是按照顺序存储的
(1)类型说明符:
说明存储的是哪种数据
(2)数组名:
类似变量名,通过数组名代表数组
1. 数组名代表的数据类型 -- 整个数组-数组也是一种数据类型
sizeof(a) //a代表的是 整个数组类型
2.数组名代表的值-表示的是数组首元素的地址 也是整个数组的起始地址,数组的地址分配是连续的一块内存空间
(3)常量表达式:--[ ]
常量表达式 --数组长度:指相同类型的数据的个数
定义时[ ]表示此时定义的是一个数组
判断数据类型的通用方式:
去掉变量名(标识符) 剩下的就是数据类型
数组的大小:
数组大小=sizeof(数据类型)*数组长度
→数组长度=sizeof(数组名)/sizeof(单个数据类型)
数组的初始化和赋值:
初始化:
//全部初始化
int a[10] = {1,2,3,4,5,6,7,8,9,10}; //{} 表示 初始化
//部分初始化
int a[10] = {1,2,3,4,5}; //这些值依次给到前面的元素,后边未初始化的元素,默认是0
//未初始化
int a[10]; //此时数组中放的是 随机值(垃圾值)
//初始化全0数组:
1.int a[ ]={};
2.int a[ ]={0};
赋值:
1.可以通过计算出一些值,赋值到数组中
for (i = 0; i < len; ++i)
{
a[i] = 表达式;
}
2.通过键盘输入 (动态定义)
for (i = 0; i < len; ++i)
{
scanf("%d",&a[i]);
}
特别的:动态定义数组长度
int i;
scanf(“%d”,&i);
int a[i];
此时i的定义与scanf语句必须在定义数组a之前,否则编译器无法分配空间,导致报错
数组元素引用:
方法:数组名[下标]
注:
1.下标可能越界,但编译不会报错(未出现语法错误),需要程序员自己小心
2.下标取值范围---[0,数组长度-1]
3.数组长度必须是个整型
4.定义时,数组长度可以省略,但是实际长度取决于初始化元素个数
int[]={1,2} //使用该方式定义必须初始化,不然编译器无法分配空间,导致报错
5.数组不能整体赋值,只能操作到具体元素(单个操作)
选择排序:
#include <stdio.h>
int main(void)
{
int n;
printf("Input a num:");
scanf("%d",&n);
int a[n];
int i = 0;
for (i = 0; i < n; ++i)
{
scanf("%d",&a[i]);
}
for (i = 0;i < n; ++i)
{
printf("%d ",a[i]);
}
putchar('\n');
int j = 0;
for (i = 0; i < n-1; ++i) //控制位置
{
for(j=i+1; j < n; ++j)//控制选择合适的数
{
if (a[i] > a[j])
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for (i = 0;i < n; ++i)
{
printf("%d ",a[i]);
}
putchar('\n');
return 0;
}
将每个元素与它后面全部元素比较,如果后面存在元素小于它,则换位,每轮小循环都会输出当前轮次最小元素,可实现从低到高排序
冒泡排序:
1 #include <stdio.h>
2 int main()
3 {
4 int a[5]={2,3,5,8,4};
5 int i,j,tmp;
6 int len=sizeof(a)/sizeof(a[0]);
7 for(i=0;i<len-1;i++)
8 {
9 for(j=0;j<len-1-i;j++)
10 {
11 if(a[j]>a[j+1])
12 {
13 tmp=a[j];
14 a[j]=a[j+1];
15 a[j+1]=tmp;
16 }
17 }
18 }
19 for(i=0;i<len;i++)
20 {
21 printf("%d ",a[i]);
22 }
23 }
当后一元素大于前一元素时,交换,这样每轮循环的开始元素都是那一轮循环的最小值,从而实现将数组从小到大输出。