一个数组元素其实就是一个变量(可以称为带下标的变量。
一、一维数组
1、定义
类型名 数组名[常量表达式];不能放变量
float s[25];float s[5*5];int a[10];char s1[30];
数组名属于用户定义标识符。要遵守
标识符
命名规则
int for[25];不合法
定义一维数组时数组名后必须用一个方括号(
[]
),将常量表达式括起来,常量表达式的值表示所定义数组 共有多少个元素(数组长度或数组的大小)。
如:下面定义为非法
int a(10); 错 ,小括号是函数的标志,计算机会认为是函数,函数声明要放形参,但10是实参。int a{10}; 错,花括号是函数体的标志,复合语句的标志,初始化的分隔符
定义数组时方括号中的
表达式不能含有变量
。另外 表达式的
值必须要大于零且为正整数
。如:
int a[1.5] ; 错int a[-10]; 错int a[n]; 错int a[0]; 错int N=9; int a[N]; 错#define N 9
int a[N]对
2、一维数组元素的引用格式
数组名[下标]
(1)先定义数组后使用
(2)不能整体用数组名
(3)C语言中不能对数组进行整体引用,只能单独引用其中的元素。引用时下标可以是表达式
char a[10]; a[0]-a[9]a[0]=’A’; 使用, 对a[3+7]=’b’; 使用, 错,越界记住:数组元素的下标值在( 0~N-1 之间)。
3、 一维数组的初始化
类型名 数组名[常量表达式]={初值1,初值2,…};
(1)
定义
一维数组时
可以将各元素的初始值依次放在 一对{}中赋给数组(必须用{}将初值括起,且初值 之间用一个逗号分隔)。
(2) 多则出错;少则补0
int a[5]={19,45,66,90,100,80}; 出错,越界
(3) 定义赋初值的个数等于数组长度,则数组长度可以省略
int a[ ]={19,45,66,90,100,80}; 自动认为是6
(4) 一个也不给则是随机值。
int a[ ]; 错int a[5]={11}; 其余为0int a[5]; 随机值
(5) 只能在定义数组的同时用{}给数组元素整体赋值
a[5]={1,2,3,4,5}; 错
二、二维数组
1、二维数组的定义格式
类型名 数组名 [常量表达式1][常量表达式2];
如:int a[10][10];十行十列char b[3][4];三行四列float s[7][3];七行三列,每个元素为float型
注:
(1)
数组名要遵守用户自定义标识符的命名规则。
(2) 定义二维数组第一个方括号常量表示行数,第二个方括号常量表示列数。
int a[4*5]; 一维,20个元素int a[4][5]; 二维,四行五列,20个元素
(3)
定义数组时方括号中的表达式不能含有变量 ,且表达式的值必须是大于0的正整数。
int i=3;int a[i][4]; 合法? 不合法
(4)
在内存中二维数组元素的存放也是连续的, 先行后列原则
2、二维数组元素的引用
数组名[行下标][列下标]
注:
(1)不能整体引用,只能引用其中的元素
(2)
引用二维数组元素时,必须有行下标和列下标两个下标。从0开始依次加1
。
3、二维数组的初始化
方法1
:将初值依序放在一对{}中,与 一维数组初始化格式相同。
例如: int a[2][3]={1,2,3,4,5,6};
方法2
:定义二维数组同时,按行初始化
每一行初值均用一对{}括起, 采用嵌套的{}格式
例如: int a[2][3]={ {1,2,3} , {4,5,6} };第0行:{1,2,3},1,2,3列第1行:{4,5,6},1,2,3列
注 意 :
定义二维数组的同时给数组初 始化,则可以省略行数,但列数不能省略
例如: int a[][3]={1,2,3,4,5,6}; 合法,两行int a[2][]={1,2,3,4,5,6}; 不合法,不能省列int a[][3]; 不合法,无初值
三、字符数组
C语言中没有字符串变量,那么如何存储?
方法1:字符数组来存放。方法2:字符型指针变量。
1、字符数组的初始化
与其它类型数组的初始化方式一样,只是其初始值是字符。
char s[]={‘a’,’b’,’c’,’d’,’e’};长度为 5
2、字符串
因为字符串最后都有一个字符串结束符(’\0’), 所以用字符数组来存放字符串时一定要有一个
元素存放结束符’\0’
(1)
字符串常量后有一个’
\0’
。
如:“ abcd” 由 5(4+1)个字符 组成,c编译器见到 双引号 加 \0 )“” 等价于”\0” , 是一个空字符串。
(2)用字符串给一字符数组进行初始化有三种情况
方法1: char a[]=”abcd”; 5(4+1) 双引号出现,花括号才能省同char a[]={‘a’,’b’,’c’,’d’}; 4方法2: char a[]={”abcd”}; 合法 , 5(4+1)方 法 3 : char a[]={‘a’,’b’,’c’,’d’,’\0’}; 5 自己加了\0,也可以认为是字符串
四、数组的使用
1、一维数组
例1
例2
2、二维数组
改进
如果printf(“\n”); 在花括号外面,所有数字会在一行输出
3、字符串使用
(1)字符串存储(赋值)四种方法
方法1:scanf( );键盘输入
char a[10]; scanf(“%s”,a);scanf(“%s”,&a); 非法
注:用%s格式输入时,遇到空格符或回车符则自动结束输入
scanf(“%s,%s”,a,b); 不能正确读取数据。
方法1:printf( );输出
如: char s[10];scanf(“%s”,s); 输入: ab cd< 回车 >printf(“%s”,s); ab (空格以为是\0结束,只输出双引号里面的,\0标志不输出)注意:输出时则从当前地址开始直到遇到结束符’ \0’ 为止
方法2:gets( )键盘输入
格式:# include<stdio.h>gets( 字符数组 )功能:读取一个字符串赋给字符数组
注:
(1)
用该函数输入字符时,只有遇到回车符系统才结束读取字符,
如: char str1[10]; gets(str1);输入: ab cd< 回车 >str1: ab cd (此时输出空格)
(2)
不论是用
%s
还是
gets()
在输入时均
不需要输入双引号
,若输入时用了双引号则双引号也作为字符串的有效字符。
方法2:puts( )输出
格式:# include<string.h>puts( 字符数组或字符串常量 )功能:在屏幕上输出字符数组中的字符。
注
用该函数输出与用%格式输出一样
只是该函数将
’\0’转成’\n’
输出。
如(1)puts(“abc”);puts(“defg”);输出结果:abcdefg( 光标也下一行)————————————————(2)printf(“abc”);printf(“defg”)abcdefg
方法3:字符串初始化
char s[]=“abcd”; 5char s[]={“abcd”}; 5char s[]={‘a’,’b’,’c’,’d’,’\0’} 5
方法4:strcpy()——拷贝
char a[10];
strcpy(a,"abcd")把abcd拷贝到数组名里
但是a=“abcd”是不对的,赋值号左边只能是变量,不能是地址常量
(2)字符串函数
第1个函数:strcat()——连接
格式 : #include<string.h>strcat( 字符数组 1, 字符数组 2)功能:“连接”从第一个串'\0'开始连入第二个串'\0'也连入返回第一个数组首地址
如:
char a[18]=” jack”;char b[10]=”zhy”;strcat(a,b);a=>”jackzhy”b=>”zhy”
少则补0,0就是'\0',因为'\0'的ASCII码就是0,它们值相同,形式不同,如果是字符型可以说少则补斜杠0,整型0和字符型0
而‘0’ 是48
第2个函数:strcpy()——拷贝
格式 : #include<string.h>strcpy( 字符数组 1, 字符数组 2)功能:将字符数组 2 中的字符串替换到字符数组 1 中。函数值为字符 数组1 的首地址。从1第一个字符开始练,把2的'\0'也连进去
如:
char str1[10]=”1234567”,str2[10]=”abc”;strcpy(str1,str2);str1=>”abc”str2=>”abc”
第3个函数: strcmp()——比较
格式 : #include<string.h>strcmp( 字符数组 1, 字符数组 2)功能:函数返回值相同位置 不同字符 的 ASCII 码差值。返回的是数值:0,两个字符串相等大于0,前面字符串大于后面字符串小于0,前面字符串小于后面字符串
例:
strcmp( abc , abc );=>0strcmp(“abc”,”abfc”);=>-3( ‘c’-‘f’=99-102 )strcmp(“abc”,”ab”);=>99( ‘c’-‘\0’=99-0 )
注:不能用关系运算符直接进行字符串大小或字符数组大小的比较(会变成地址的比较)“ abc”==”abc”“abc”>”ab”
第4个函数: strlen( )——不算\0
格式 : #include<string.h>strlen( 字符数组 )功能:求出字符数组的实际长度(不包括结束符)
char a[10] =”4332567”
printf(“%d”,strlen(a)); //7
char a[]=”abc\018\0”; //5char a[]=”abc\017\0”; //4
char a[]=”abc\08\0”; //3
printf(“%d”,strlen(a));
(3)例题分析
例题1
例题2