数组的概念
数组是一组有序的、类型相同的数据的集合,这些数据称为数组的元素
一维数组
- 定义
语法格式:类型说明符 数组名[正整型常量表达式]
类型说明符指定数组的类型,数组名和变量名命名规则相同
方括号内是数组的长度,下标或方括号的个数称为数组的维度
数组元素的类型称为数组的基类型
不允许使用变量对数组大小进行定义,数组的说明语句必须在可执行语句之前 - 初始化
1)对全部元素初始化:int a[5]={1,2,3,4,5};
或int a[] ={1,2,3,4,5};
,即对全部元素赋值可以不指定长度
2)对部分元素赋值,其他按0处理:int a[9] = {1,2};
,这样a[0]=1,a[1]=2,其他元素为0
3)一维数组赋值的个数不能超过数组长度 - 一维数组的引用
1)一次只能引用单个数组元素,不能一次引用整个数组
2)数组名是数组的首地址,即a[0]的地址,是一个地址常量
3)数组元素是一个数值,引用数组元素时,根据首地址和下标自动计算元素的实际地址
4)不能直接数组a = 数组b
的方式赋值,因为数组b只是一个地址,并不是实际的值
5)要让一个数组赋值给另一个数组要逐个元素赋值或使用循环赋值 - 程序实例
1)利用数组计算斐波那契数列的前20个数,并以每行5个输出
2)随机输入6个整型数字,利用冒泡排序法排序#include<stdio.h> int main(){ int F[20],i; F[0] = F[1] = 1; for (i=2;i<20;i++){ F[i] = F[i-1]+F[i-2]; } for (i=0;i<20;i++){ if(i%5==0){ printf("\n"); } printf("%6d",F[i]); } return 0; }
#include<stdio.h> int main(){ int a[6],i,j,tmp,p; for(i=0;i<6;i++){ scanf("%d",&a[i]); } printf("\n"); for(i=0;i<6-1;i++){ for(j=1;j<6-i;j++){ if(a[j-1]>a[j]){ tmp = a[j]; a[j] = a[j-1]; a[j-1] = tmp; } } for(p=0;p<6;p++){ printf("%d ",a[p]); } printf("\n"); } return 0; } }
二维数组
- 定义
语法格式:类型说明符 数组名[正整型常量表达式][正整型常量表达式]
二维数组在内存中按行的顺序存放
其他定义条件与一维数组相同 - 初始化
1)分行给二维数组赋值:int a[2][3] = {{2,3,1}, {1,2,3}};
2)全部元素按顺序赋值:int a[2][3] = {2,3,1,1,2,3};
或int a[ ][3] = {2,3,1,1,2,3};
,即第一个下标可以省略
3)对部分元素赋值:int a[2][3] = {{1},{0,1},{0,0,1}};
、int a[2][3] = {{1},{},{0,0,1}};
、int a[2][3] = {{5,6},{7,8}};
、int a[2][3] = {5,6,7,8};
- 二维数组的引用
1)数组名是数组的首地址,即a[0][0]的地址,是一个地址常量
2)数组名是常量,不能对其赋值 - 程序实例
将一个矩阵a={{1,2,3},{4,5,6}}转置存到另一个矩阵b中#include<stdio.h> int main(){ int a[][3] = {{1,2,3},{4,5,6}}; int b[2][3],i,j; for(i=0;i<2;i++){ for(j=0;j<3;j++){ b[j][i] = a[i][j]; } } for(i=0;i<3;i++){ for(j=0;j<2;j++){ printf("%d ",b[i][j]); } printf("\n"); } return 0; }
字符数组与字符串
- 定义
C语言用字符数组存放字符串
语法格式:char 数组名[正整型常量表达式]
字符串实际占有存储单元的数量等于字符串长度+1,因为还要存一位结束符 \0
- 初始化
1)用单个字符对字符数组初始化
char ch[6] = {'C','H','I','N','A','\0'};
初值个数少于数组长度时,系统会自动添加结束符
初值个数(包括结束符)等于数组长度时,定义时可以省略长度
初值个数超过数组长度时,会报错
2)用字符串常量对字符数组初始化
char ch[6] = "china";
或char ch[] = "china"
长度为n的数组,只能存n-1个字符,剩下的一位要给结束符
即char d[12]="How are you";
等价于char d[12] = {'H','o','w','' ','a','r','e',' ' ,'y','o','u','\0'};
在循环结构中可以用结束符来控制循环
字符数组的输入和输出
- puts输出字符串函数、使用printf和%s输出字符串
puts函数输出后会自动换行,而printf不会#include<stdio.h> int main(){ char a[] = "book"; printf("%s",a); puts(a); return 0;}
- gets输入字符串函数、使用scanf和%s输出字符串
gets可以接收空格,scanf不能
使用scanf时数组名前不用&号
&号的含义是取地址,而数组名本身就有代表地址的意思#include<stdio.h> int main(){ char a[12]; gets(a); //输入How are you puts(a); //输出How are you scanf("%s",a); //输入How are you puts(a); //输出How return 0;}
- 字符串处理函数,需要<string.h>
1)strcat(字符数组1, 字符数组2):连接两个字符串
2)strcpy(字符数组1, 字符数组2):将2拷贝到1中,1的长度应大于2
3)strlen(字符数组):返回数组的长度(不包括\0)
4)strlwr(字符数组):将大写字符串变为小写字符串
5)strcmp(字符数组1, 字符数组2):字符串的比较- 比较两个字符串第一个不同字符的ACSII码的大小
- 如果全部字符都相等,返回0
- 如果有不相等的,返回该位置字符的ACSII码之差