第七章数组和指针.ppt

第七章数组和指针;7.1数组及数组元素

7.1.1一维数组;[例7.1]用气泡法完成对10个数从小到大排序。

第一趟扫描找到了最小的数存入a[0],其过程如下:

a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[10]

;;main()

{inta[11],i,j,t;

printf(“inputtennumbers:\n”);

for(i=1;i11;i++)scanf(“%d”,a[i]);

printf(“\n”);

for(i=1;i10;i++)

for(j=10;ji;j--)

if(a[j-1]a[j])

{t=a[j];a[j]=a[j-1];a[j-1]=t;}

printf(“thesortednumbers:\n”);

for(i=0;i11;i++)printf(“%d”,a[i]);

};上述程序有许多值得改进的地方。

(1)在9趟由底向上的扫描中,可能最后几趟已无任何交换发生,程序应能做到,一旦发现某趟扫描中无任何交换时就会终止;

(2)在每趟扫描中,上趟扫描中最后一次交换的位置k是至关重要的,因为当jk时,将再也没有任何交换发生,从而应该在此结束此趟扫描;

(3)为使算法具有对称性,扫描的方向有两种可能的选择,一是使轻气泡上浮,一是使重气泡下沉。;例:用选择法排序。即先将10个数中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换;每比较一轮,找出一个未经排序的数中最小的一个。共应比较9轮。;7.1.2二维数组;[例7.2]将4×4的矩阵转置并输出。;7.1.3多维数组;1.同一个数组中的所有元素占用一组连续的存储空间;

2.数组的存储分配按行进行;

3.数组名字表示该数组的首元素地址。

对于一维数组而言,各元素按下标次序依次存放,

如a[0],a[1],a[2],…等等。且有:

a[0]:

a[1]:

a[2]:;数组中任一元素a[i]的地址可表示为:

a[i]=a+i*sizeof(元素类型)

其中sizeof(元素类型):求每个元素占用存储空间的字节数。例如:charch[10];inta[10];

设ch=FFE0,a=FFEA则

ch[0]=FFE0+0*1=FFE0a[0]=FFEA+0*2=FFEA

ch[1]=FFE0+1*1=FFE1a[1]=FFEA+1*2=FFEC

┇┇

ch[9]=FFE0+9*1=FFE9a[9]=FFEA+9*2=FFFC

C语言不对下标是否越界进行检查,C语言编译程序将实际指向分配给数组x的存储空间以外的存储区域。;二维数组:按行存放

例如:intx[2][3]/*它有2×3个数组元素*/

x[0][0]x[0][1]x[0][2]

x[1][0]x[1][1]x[1][2]

其存储分配顺序为:

x[0][0]?x[0][1]?x[0][2]?x[1][0]?x[1][1]?x[1][2]

x[0][0]

x[0][1]

x[0][2]

x[1][0]

x[1][1]

x[1][2];C中的二维数组可以看作是一种特殊的一维数组。

例如floata[3][4];

a[0]a[0][0]a[0][1]a[0][2]a[0][3]

a-a[1]a[1][0]a[1][1]a[1][2]a[1][3]

a[2]a[2][0]a[2][1]a[2][2]a[2][3]

二维数组元素a[i][j]的地址可以这样得到:

a[i][j]=a[i]+j*sizeof(a[0][0])

=a+i*sizeof(a[0])+j*sizeof(a[0][0])

=a+i*16+j*4

例:a[1][2]=a+1*16+2*4=a+24;;7.3数组的初始化;在对全部数组元素初始化时,可以不指定数组的长度。例如:

staticinta[5]={1,2,3,4,5};

可以写成:statici

文档评论(0)

1亿VIP精品文档

相关文档