数组入门

来源:互联网 发布:4g网络费流量吗 编辑:程序博客网 时间:2024/06/06 00:04

引子

关于程序员有一个这样梗,他们喜欢从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 8void 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、将数组应用于一些简单的算法