引子
关于程序员有一个这样梗,他们喜欢从0开始计数,也许这个梗是因为数组的缘故吧
float eg的值 | eg[0] | eg[1] | eg[2] | eg[3] | eg[4] | eg[5] |
---|---|---|---|---|---|---|
各项的值 | 1.5 | 1.2 | 6.5 | 56.4 | 34.4 | 5.6 |
空间地址 | A | A+1 | A+2 | A+3 | A+4 | A+5 |
上图 是一组已经申请好空间并赋好值的浮点型变量,由图可知,下标由0开始计数,需要知道的是数组在内存空间是连续存放。
连续存放有个好处是指针A与数组的配套使用,可以对数组各元素的地址,进行函数间的地址传递。
1、定义一个数组
类型 名字[大小];
eg1常见的方式:
int a[10];
float b[12];
double c[3];
eg2:也可以用宏定义
define N 10;
int a[N];
eg3:很少见(只适用C99,慎用)
C语言中,直到C99标准出现之前,声明数组时在方括号内只能使用整数常量表达式。而C99做了很大改进,允许数组的[ ]中的值是整形变量或是整形表达式。这就解释了下面的情况:
int n;
scanf ("%d", &n);
int array[n];
虽然n确实是需要运行时动态确定的变量,但是在C99中,以这种变量作为数组大小的形式已经是允许的了。这样的数组就被称之为“变长数组”。
注意:变长数组是指用整型变量或表达式声明或定义的数组,而不是说数组的长度会随时变化,变长数组在其生存期内的长度同样是固定的。
——来自百度百科:变长数组
eg3 打破了一般人对数组的认识,对新手而言掌握eg1、eg2就够了,知道定义一个数组大小时输入一个常量就足够了。
2、数组赋值
eg1:新手最容易接受的做法
int i;
f;oat a[10];
for(i=0;i<10;i++)
scanf("%f",&a[i]);
eg2:进阶玩法
int a[10] = {43,2,4,23,12,5,4,34,2,1};
/*也可以直接省略括号中的数字,让编译器自动匹配大小*/
int a[] = {43,2,4,23,12,5,4,34,2,1}
此时数组值及空间如下
数组元素 | a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] | a[9] |
---|---|---|---|---|---|---|---|---|---|---|
数组元素值 | 43 | 2 | 4 | 23 | 12 | 5 | 4 | 34 | 2 | 1 |
eg3:高阶玩法
任性的赋值也可以
int a[10] = {43,2,4,23,12,0,0,0,0,0};
/*也可以这样子*/
int a[10] = {43,2,4,23,12}//未赋值的元素自动添0
此时数组值及空间如下
数组元素 | a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] | a[9] |
---|---|---|---|---|---|---|---|---|---|---|
数组元素值 | 43 | 2 | 4 | 23 | 12 | 0 | 0 | 0 | 0 | 0 |
对初学者而言不必过于关注高阶玩法,C99可以指定初始化项目,这里不做过多解释
三、实际应用
来一个简单选择法排序,建议在了解原理的基础上自己动手重构代码
简单选择排序一句话概括:每次选择无序数列中最小(大)的将其放在有序数列的最后(前)。
/* Note:Your choice is C IDE */
#include "stdio.h"
#define N 8
void main()
{
int a[N]={34,23,6243,123,32,41,412,43};
int i,j=0,k=0,tmp;
for (i=0;i<N-1;i++)
{
k=i;
for(j=i+1;j<N;j++)
{
if(a[k]>a[j])
{
k=j;
}
}
if (k!=i) // 找到一个max,并插入,。。
{
tmp=a[k];
a[k]=a[i];
a[i]=tmp;
}
}
for(i=0;i<N;i++)
printf("%d ",a[i]);
}
小结
1、初步认识数组
2、将数组应用于一些简单的算法