C语言数组结构介绍
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数组元素(用下标去引用)相当于一个普通变量, 可以出现在该类变量可以出现的所有场合。
数组名不是一个普通的变量名,而是第一个数组 元素的地址。
第1页/共41页
一维数组的初始化
数组可以在定义的时候就进行初始化(赋初值) 例如:int score[10]={0,1,2,3,4,5,6,7,8,9};如
scanf("%d",&a[i]); printf("befor sorting:\n"); for(i=0;i<N;i++)
printf("%-5d",a[i]); printf("\n");
第5页/共41页
for(i=0;i<N-1;i++) for(j=0;j<N-i-1;j++) if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; }
果括号内的数小于10个,那么只是从score[0]开始 赋值,剩下的没有赋值的数组元素的值初始化为0。 如果只是定义而没有初始化(一个都没赋初值), 则所有的数组元素的值都是不可预测的。 如果在定义数组时候,已经对所有的数组元素进行 赋初值,数组的长度可以省略int score[10]={0,1,2,3,4,5,6,7,8,9};等价于int score[]={0,1,2,3,4,5,6,7,8,9};
第2页/共41页
如果没有对所有的数组元素进行赋初值,例如int score[]={0,1,2,3,4,5,6,7,8};编译系统测出赋 初值的个数为9,就认为数组的长度是9而不是10。
【例6.3】输入10个数,用冒泡法排序(从小到大) 冒泡排序是相邻的两个数进行比较,如果前一个比
后一个大,就交换,每一轮都会把本轮要比较的所 有的数中最大的那个数放到最后,小的数往前面移 动,就像水里的气泡逐渐往上浮一样。
编译器会认为第一维的长度是2,而不是3 b[2][0]~b[2][3]的值是不确定的,引用
第9页/共41页
二维数组的引用
格式:数组名[下标1][下标2]
与一维数组相同,下标可以是常数或者常数表达式,也可以是 变量或者变量表达式,但必须是整数。
二维数组的初始化
二维数组在定义的时候就可以进行初始化,例如 int b[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};等价于 int b[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
依次类推,直到第0个跟第1个数比较,把最大者放 到第1的位置,这样就可以把整个数组排好序。
冒泡法每轮都把该轮要比较的数的最大者放到最后
第4页/共41页
#include<stdio.h> #define N 10 main( ) {
int a[N]; int i,j,temp; for(i=0;i<N;i++)
第7页/共41页
二维数组的定义、引用及初始化
二维数组的定义
格式:类型说明符 数组名[常量表达1] [常量表达2];
例如,int b[3][4];定义了一个3行4列的二维数 组,一共有12个数组元素,每个都是int类型,序 号从b[0][0]~b[2][3]。逻辑顺序如下:
b[0][0] b[1][0] b[2][0]
(分行赋初值,更直观,建议使用)
第10页/共41页
在这里已经给数组所有元素赋初值了,第一维的长度 可以省略,但是不建议省略。第二维的长度不可省略。 赋值效果如下:
0123 4567 8 9 10 11
第11页/共41页
二维数组(或者多维数组)省略写第一维的情况 int b[][4]={{0,1,2,3},{4,5,6,7},{8,9 }};没有问
第3页/共41页
第1轮,把第0跟第1个数比较,第1跟第2个数比 较……第n-2个数跟第n-1个数比较,如果前一个数 比后一个大,就交换。那么第1轮交换结束后,就把 第0个至第n-1个数中最大者放到第n-1的位置;
第2轮,把第0跟第1个数比较,第1跟第2个数比 较……第n-3个数跟第n-2个数比较,如果前一个数 比后一个大,就交换。那么第2轮比较结束后,就可 以把第0至第n-2个数中最大者放到第n-2的位置;
b[0][1] b[1][1] b[2][1]
b[0][2] b[1][2] b[2][2]
b[0][3] b[1][3] b[2][3]
第8页/共41页
二维数组是按行存储
先存完第1行,再存第2行,第3行……,直到最后一 行。在内存中存储顺序如下:
第0行
第1行
第2行
第3行
b[0][0] b[0][1] b[0][2] b[0][3] b[1][0] b[1][1] b[1][2] b[1][3] b[2][0] b[2][1] b[2][2] b[2][3]
题,最后一行没有赋值的两个数组元素会初始化为 0。
0123 4567 8900
第12页/共41页
int b[][4]={{0,1,2,3},{4,5},{8,9}};
也没有问题,最后两行有两个没有赋值的数组元 素也会初始化为0。
01Hale Waihona Puke Baidu3
4500 8900
第13页/共41页
但是int b[][4]={{0,1,2,3},{4,5,6,7}}; 还可以吗?
一维数组的引用
格式:数组名[下标]
下标可以是常数或者常数表达式,也可以是变量 或者变量表达式,但必须是整数。
数组不可整体引用,不可整体赋值,想给一维数 组score里面的50个数组元素都赋值为0,使用 score=0是错误的,可以使用循环结构来赋值: for(i=0;i<50;i++) score[i]=0; 使用数组不但 简化了变量的命名,还简化了变量的使用。
printf("after sorting:\n"); for(i=0;i<N;i++)
printf("%-5d",a[i]); printf("\n"); }
第6页/共41页
运行结果如下: 1 3 5 7 9 2 4 6 8 10 befor sorting: 1 3 5 7 9 2 4 6 8 10 after sorting: 1 2 3 4 5 6 7 8 9 10 Press any key to continue
数组名不是一个普通的变量名,而是第一个数组 元素的地址。
第1页/共41页
一维数组的初始化
数组可以在定义的时候就进行初始化(赋初值) 例如:int score[10]={0,1,2,3,4,5,6,7,8,9};如
scanf("%d",&a[i]); printf("befor sorting:\n"); for(i=0;i<N;i++)
printf("%-5d",a[i]); printf("\n");
第5页/共41页
for(i=0;i<N-1;i++) for(j=0;j<N-i-1;j++) if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; }
果括号内的数小于10个,那么只是从score[0]开始 赋值,剩下的没有赋值的数组元素的值初始化为0。 如果只是定义而没有初始化(一个都没赋初值), 则所有的数组元素的值都是不可预测的。 如果在定义数组时候,已经对所有的数组元素进行 赋初值,数组的长度可以省略int score[10]={0,1,2,3,4,5,6,7,8,9};等价于int score[]={0,1,2,3,4,5,6,7,8,9};
第2页/共41页
如果没有对所有的数组元素进行赋初值,例如int score[]={0,1,2,3,4,5,6,7,8};编译系统测出赋 初值的个数为9,就认为数组的长度是9而不是10。
【例6.3】输入10个数,用冒泡法排序(从小到大) 冒泡排序是相邻的两个数进行比较,如果前一个比
后一个大,就交换,每一轮都会把本轮要比较的所 有的数中最大的那个数放到最后,小的数往前面移 动,就像水里的气泡逐渐往上浮一样。
编译器会认为第一维的长度是2,而不是3 b[2][0]~b[2][3]的值是不确定的,引用
第9页/共41页
二维数组的引用
格式:数组名[下标1][下标2]
与一维数组相同,下标可以是常数或者常数表达式,也可以是 变量或者变量表达式,但必须是整数。
二维数组的初始化
二维数组在定义的时候就可以进行初始化,例如 int b[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};等价于 int b[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
依次类推,直到第0个跟第1个数比较,把最大者放 到第1的位置,这样就可以把整个数组排好序。
冒泡法每轮都把该轮要比较的数的最大者放到最后
第4页/共41页
#include<stdio.h> #define N 10 main( ) {
int a[N]; int i,j,temp; for(i=0;i<N;i++)
第7页/共41页
二维数组的定义、引用及初始化
二维数组的定义
格式:类型说明符 数组名[常量表达1] [常量表达2];
例如,int b[3][4];定义了一个3行4列的二维数 组,一共有12个数组元素,每个都是int类型,序 号从b[0][0]~b[2][3]。逻辑顺序如下:
b[0][0] b[1][0] b[2][0]
(分行赋初值,更直观,建议使用)
第10页/共41页
在这里已经给数组所有元素赋初值了,第一维的长度 可以省略,但是不建议省略。第二维的长度不可省略。 赋值效果如下:
0123 4567 8 9 10 11
第11页/共41页
二维数组(或者多维数组)省略写第一维的情况 int b[][4]={{0,1,2,3},{4,5,6,7},{8,9 }};没有问
第3页/共41页
第1轮,把第0跟第1个数比较,第1跟第2个数比 较……第n-2个数跟第n-1个数比较,如果前一个数 比后一个大,就交换。那么第1轮交换结束后,就把 第0个至第n-1个数中最大者放到第n-1的位置;
第2轮,把第0跟第1个数比较,第1跟第2个数比 较……第n-3个数跟第n-2个数比较,如果前一个数 比后一个大,就交换。那么第2轮比较结束后,就可 以把第0至第n-2个数中最大者放到第n-2的位置;
b[0][1] b[1][1] b[2][1]
b[0][2] b[1][2] b[2][2]
b[0][3] b[1][3] b[2][3]
第8页/共41页
二维数组是按行存储
先存完第1行,再存第2行,第3行……,直到最后一 行。在内存中存储顺序如下:
第0行
第1行
第2行
第3行
b[0][0] b[0][1] b[0][2] b[0][3] b[1][0] b[1][1] b[1][2] b[1][3] b[2][0] b[2][1] b[2][2] b[2][3]
题,最后一行没有赋值的两个数组元素会初始化为 0。
0123 4567 8900
第12页/共41页
int b[][4]={{0,1,2,3},{4,5},{8,9}};
也没有问题,最后两行有两个没有赋值的数组元 素也会初始化为0。
01Hale Waihona Puke Baidu3
4500 8900
第13页/共41页
但是int b[][4]={{0,1,2,3},{4,5,6,7}}; 还可以吗?
一维数组的引用
格式:数组名[下标]
下标可以是常数或者常数表达式,也可以是变量 或者变量表达式,但必须是整数。
数组不可整体引用,不可整体赋值,想给一维数 组score里面的50个数组元素都赋值为0,使用 score=0是错误的,可以使用循环结构来赋值: for(i=0;i<50;i++) score[i]=0; 使用数组不但 简化了变量的命名,还简化了变量的使用。
printf("after sorting:\n"); for(i=0;i<N;i++)
printf("%-5d",a[i]); printf("\n"); }
第6页/共41页
运行结果如下: 1 3 5 7 9 2 4 6 8 10 befor sorting: 1 3 5 7 9 2 4 6 8 10 after sorting: 1 2 3 4 5 6 7 8 9 10 Press any key to continue