第八章
任务一:一维数组的基本定义和基本使用
任务二:选择排序
任务三:冒泡排序
任务四:“选择排序”和“冒泡排序”的区别
小结
习题
今天,我们来学习“一维数组”,“一维数组”从字面意思可以看出来是多个数据分成了一个组,有序的元素数列,数组有一维数组,二维数组,三维数组,多维数组…具体描述,可进入“百度百科”自行了解,我们本章只讲一维数组,下一章将会将二维数组。
我们先来看C语言中的“一维数组”是如何定义的,
int a[6]; 意思是定义一个整数类型的一维数组,数组名为 a 其中数组的元素(成员)数量为6个,这里的6个元素(成员)已经被分配到了由 数组名为 a 为首地址(这里的首地址为:a[0])后面的储存区域之中,如图(内存区域图):
其实在我们定义一维数组并分配n个元素(成员)的时候,系统会自动给每个元素(成员)分配一个值,因为在内存中,不能有空值的出现,无论我们如何定义,就算是非数组,只要我们定义了,占内存区域了,那么将必须有某个数值先暂时占用这个空间
a[0]=1; 给一维数组名为 a 的 “下标” 为 0 (也就是第一个位置)赋值为1,这里的a[0]中的0是指“下标”不同语言的数组“下标”起点值可能不同“C语言”的数组“下标”由“0”为起点,而“E语言”数组的“下标”由“-1”为起点
a[1]=2;给一维数组名为 a 的 “下标” 为 1 (也就是第二个位置)赋值为2,
printf 我们输出一维数组和输出 int 类型的 一般数值 是一样的,
#include<stdio.h> int main() { int a[6]; a[0]=1; a[1]=2; printf("a[0]=%d a[1]=%d\n",a[0],a[1]); return 0; }
代码调试截图:
上面的定义方式其实是受限制的,一般我们使用的很少,因为我们后期修改更新软件时,说不定就需要额外的数组,但也不敢修改,怕出现一重又一重的bug,
那么我们还有其他定义一维数组的办法,就是我们定义一个常量,用这个常量来控制数组的元素(成员)数量的多少,这样可以轻松管理,(原来打算用 一个变量来控制,可以会出现乱值)
#include<stdio.h> #define N 3 int main() { int a[N]; a[0]=1; a[1]=2; a[2]=3; printf("a[0]=%d a[1]=%d a[2]=%d\n",a[0],a[1],a[2]); return 0; }
代码调试截图:
我们再看看下一个定义方式,数组的使用方式近似变量,那么我们也可以像变量一样定义时给予赋值,
#include<stdio.h> #define N 3 int main() { int a[N]={1,2}; printf("a[0]=%d a[1]=%d a[2]=%d\n",a[0],a[1],a[2]); return 0; }
那么,我们发现我们定义了3个元素(成员),其中前两个已经给予赋值,第三个没有给予赋值,那么第三个元素(成员)输出的内容,将会自动被填充为“0”(PS:我感觉因为没有赋值,所以编译器将这个数变为0也就是假,,,这仅仅是我的猜想)
代码调试截图:
我们也可以这样定义:
a[]={};中括号不写定义多少个元素(成员),只需要直接在花括号里填写数值就行,它会自动为你所填写的数值的个数多少而分配多少内存空间,
#include<stdio.h> int main() { int a[]={1,2,3,4,5,6}; printf("a[0]=%d a[1]=%d a[2]=%d\n",a[0],a[1],a[2]); printf("a[10]=%d\n",a[10]); return 0; }
若输出超出内存空间的数值,将会出现乱值,
代码调试截图如下:
我们可以猜想一下这个a[10]会不会是a[]的地址,
代码如下:顺便给大家展示一下,各个数组之间地址的联系,
#include<stdio.h> int main() { int a[]={1,2,3,4,5,6}; printf("a[0]=%d a[1]=%d a[2]=%d\n",a[0],a[1],a[2]); printf("a[10]=%d\n第一个元素地址%d\n第二个元素地址%d\n第三个元素地址%d\n",a[10],&a[0],&a[1],&a[2]); return 0; }
代码调试截图如下:我们发现我们猜想的a[10]地址和a[]有关,那么这个猜想是错误的,但我们发现了a[0],a[1],a[2]之间元素的地址关系,都相邻相差4,这个4恰好是 int 类型的内存大小。
我们稍作休息,然后进入下一页学习“选择排序”
评论抢沙发