1.一维数组的定义
类型名 数组名[常量/常量表达式];
例如: int a[6];
注意:① 数组名不能与其他变量名相同;
② 第一个元素a[0]的地址是数组的首地址,是地址常量;
③ 数组定义时下标不能是变量,但引用时可以使用变量;
④ C语言的编译器不对下标越界进行检查
2.一维数组的初始化
数组名[常量表达式] = {值,值,值,...,值};
例如: int a [5] = {1,2,3,4,5};
注意:① 如未给static数组赋初值,全部元素都将为0
如:static int a[5];
则a[0] = 0, a[1] = 0, a[2] = 0 ...
3.二维数组的定义
二维数组有两个下标,第一个是行下标,第二个是列下标。
二维数组的定义格式一般为:
类型名 数组名[常量表达式1] [常量表达式2];
例如:int a[5][4];
C语言中,二维数组中元素排列的顺序是:按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素,以此类推。
数组名a表示数组第一个单元a[0][0]的地址,也就是数组的首地址。a[0]也表示地址,表示第0行的首地址,即a[0][0]的地址;a[1]表示第1行的地址,即a[1][0]的地址,以此类推。
a = a[0] = &a[0][0] //&是取地址运算符,&a[0][0]表示元素a[0][0]的地址
4.二维数组的初始化
(1).按行分段给每个元素赋值
数组名[常量表达式1][常量表达式2] = {{值,值,...},{值,值,...},{值,值,...},...{值,值,...}};
例如:int a[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
(2).按数组元素在内存中的排列顺序给每个元素连续赋值
例如:int a[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
(3).给部分元素赋值
当{}中值的个数小于元素个数时,只给前面部分元素赋值,后面的自动取0
例如:int a[4][4] = {{1},{2}};
等价于:
int a[4][4] = {{1,0,0,0},{2,0,0,0},{0,0,0,0},{0,0,0,0}};
(4).对全部元素赋初值,行长度可以省略,列长度不能省略
例如:int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
对这种连续赋值的方式,系统会根据初值的个数与列数的商数取整得到行数,12对4的商取整为3,则系统认为有3行。
int a[][4] = {{1,2,3},{1,2},{1}};
对这种按行分段赋值方式,系统会根据最外层花括号内的花括号个数来定义行数,对该例系统认为有3行。等价于
int a[3][4] = {{1,2,3,0},{1,2,0,0},{1,0,0,0}};
5.字符数组与字符串
(1).字符数组的初始化
除了常规初始化方法,可以用字符串常量直接进行初始化,
例如: char c[15] = "Beijing";
注意:字符串存储时,系统自动在末尾加上"\0":
a. char c[] = "China"; b. char c[5] = "China"; c. char a[8] = "China";
C h i n a \0 C h i n a C h i n a \0 \0 \0
0 1 2 3 4 5 0 1 2 3 4 0 1 2 3 4 5 6 7
同时也可利用库函数,由用户输入初值
char city[15];
scanf("%s",city);
如果制定的字符数组的大小恰好等于字符串常量中显式出现的字符个数,那么字符串结束标志"\0"就不被放入字符数组中
(2).字符串与字符数组的输入输出
字符数组输出方法有以下两种:
a.用"%c"格式符按字符逐个输入输出
b.用"%s"格式符按字符串一次性输入输出
注意:C语言中,数组名代表该数组的起始地址,因此,scanf()函数中不需要地址运算符"&"
在输入两个字符串时,中间必须要使用空格隔开
在输入字符串时,字符串的最大长度必须比字符数组的长度小1
6.字符串的处理函数
(1). puts函数
puts(字符数组名/字符串);
功能:向显示器输入字符串,输出后换行
例如:
#include <stdio.h>
void main()
{
char c[] = "C++";
puts(c);
}
puts函数完全可以由printf取代,当需要一定格式的时候,通常使用printf函数。
(2).gets函数
格式:gets(字符数组);
功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加上"/0"。得到一个函数值,该函数值是字符数组的起始地址。
说明:输入串长度应小于字符数组长度。本函数得到一个函数值,即为该字符数组的首地址。
(3).strcat函数
格式:strcat(字符数组1,字符数组2);
功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志"/0"。
注意:① 字符数组1必须足够大
② 连接前,两字符串均以"\0"结束;连接后,串1的"\0"取消,新串最后加"\0"。
③ 本函数返回值是字符数组1的首地址。
(4).strcpy函数
格式:strcpy(字符数组1,字符数组2)
功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志"\0"也一同拷贝。字符数组2可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
注意:① 字符数组1必须足够大
② 拷贝时"\0"一同拷贝。
③ 不能使用赋值语句为一个字符数组赋值。
(5).strcmp函数
格式:strcmp(字符数组1,字符数组2);
功能:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或"\0"为止。
字符串1=字符串2,返回数为0;
字符串1>字符串2,返回正整数;
字符串1<字符串2,返回负整数。
说明:① 字符串比较不能用"==",必须使用strcmp函数
② 本函数也可用于比较两个字符串常量,或比较数组和字符串常量。
(6).strlen函数
格式:strlen(字符数组);
功能:测字符串的实际长度(不含字符串结束标志'\0')并作为函数返回值。
(7).strupr函数
格式:strupr(字符数组);
功能:将字符串中所有字符都转换为大写字符
(8).strlwr函数
格式:strlwr(字符数组);
功能:将字符数组中所含字符串的所有字符都转化成小写字符
(9).strset函数
格式:strset(字符数组,字符);
功能:将字符数组中所含字符串的所有字符都换成指定字符。
注:函数7-9都在库文件string.h中。