一维数组的定义方式:
数据类型 数组名[整型常量表达式]
注意:方括号中只能是常量表达式,不能使用变量。常量表达式的值表示数组最多能存放的元素的个数,也称为数组的大小
数组所占总字节数=sizeof(数据类型)*数组大小
int k=5;float c[k]; 不合法,k是变量
#define M 20
int num[M]; //合法,M是编译预处理命令define定义的符号常量
&数组名[下标]代表元素在内存中的地址。
ch[2.5+2.5] //非法,下标只能是整型表达式
ch[10-10] //合法,相当于ch[0]
一维数组的初始化
变量的初始化就是定义变量的同时赋初值,一维数组初始化有以下几种
(1)char a[5]={'h','e','l','l'};
(2)int a[6]={1,2,3};
(3)int a[]={1,2,3} //在定义时[]中的值不能为空,只有当用初始值进行初始化时,才可省略,利用初始值的个数作为数组的大小。
二维数组
定义:类型说明符 数组名[整型常量表达式][整型常量表达式]; //int a[3][4];
二维数组的引用
类似于一维数组元素的引用方式,二维数组元素的引用方式也是 “数组名[下标]”。其区别是,二维数组是“有行有列”,因此比一维数组多一个下标,即 数组名[下标][下标]
例如“int a[3][4];定义一个具有3行4列的整型数组a,数组可以存放12个整数。可以将数组a看成是由3个一维数组组成的,每个一维数组中又含有4个元素。这3个一维数组的名称是a[0]、a[1]和 a[2],第一个数组a[0]的各元素为a[O][O]、a[0][1]、 a[0][2]、a[O[3];第二个数组、第三个数组以此类推。数组a各成员变量如下:
a[0][0],a[0][1], a[0][2], a[0][3]
a[l][0], a[1][1], a[1][2], a[1][3]
a[2][0],a[2][1], a[2] [2], a[2][3]
在内存中二维数组是否也是这样“有行有列”存放吗?答案是否定的。计算机内存没有什么所谓的“行”与“列”,都是以字节为单位的连续空间。二维数组在内存存放时,采用“逐行存放”,行是“从上到下”,每一行是“从左至右”。例如,上例中的数组a[3][4]在内存存放元素的顺序是: a[O][0]→a[0][1]→a[0][2]- a[0][3]→a[1][0]-._ a[2][2]-a[2][3]。
二维数组的初始化
二维数组初始化有以下几种方法
(1)int a[3][4]={ {1,2,3,4},{5,6,7,8},{9,10,11,12}};
(2)int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(3)int a[3][4]={ {1,2},{5}};
(4)int a[3][4]={1,2,5};
(5)int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12}; //只能省略行数,不能省略列数,原因在于二维数组是按行进行存放的,省略列数就无法控制何时转入下一行。
(6)int a[][4]={1,2,3,4,5,6};
字符串与字符数组
字符串存放内存时,除了将其中的每个字符存入内存外,还要在最后加一个“\0”字符存入内存,“\0”也是字符串结束标志。定义用于存放字符串的字符数组时,数组的大小应该字符串的长度+1。
1、用一维数组存放一个字符串
(1)char a[4]={'a','b','c','d'};//一维字符数组
(2)char a[5]={'a','b','c','d','\0'}; //存放了字符串abcd
(3)char a[5]={"abcd"} //双引号是字符串常量的标志
(4)char a[5]="abcd" //与(3)等价
(5)char a[]="abcd" ; //有初始值来确定数组的大小
(6)char a[]={'a','b','c','d'};
2、用二维数组存放多个字符串
char s[3][10]={"456","ab","M"}; //表示二维数组最多可以存放三个字符串,每个串的长度最大为9,留一个存放‘\0’
字符串的输入输出
1、字符串的输出
字符串的输出可以使用printf()和puts()
1)printf()函数
(1)按%c的格式,利用循环控制语句将字符串中的字符逐个输出到屏幕
#include
void main()
{
int i;
char str[6]={'w','o','r','l','d','\0'};
for(i=0;i<6;i++)
printf("%c",str[i]); //world
}
(2)按%s的格式,用printf()将数组的内容输出到屏幕,直到遇到‘\0’为止。
#include
void main()
{
char str1[5]={'w','o','r','l','d'};
char str2[6]={'w','o','r','l','d','\0'};
char str3[]="world";
printf("str1:%s\n",str1);
printf("str2:%s\n",str2);
printf("str3:%s\n",str3);
}
分析:从程序中可以看出利用printf()函数使用%s格式进行输出字符数组时,输出列表中使用的是“数组名”。输出字符数组str1时,显示的结果中最后出现了一些随机字符,原因在于数组str1初始化时没有结束标志\0,因此输出时会把超出数组范围的内存中随机的字符输出,直到遇到机内的"0'为止,这显然不是我们所期望的。而数组str2和str3在初始化时都是按照字符串的格式进行初始化的,因此输出结果是正常的。
因此,prinf函数采用%s的格式常用于输出字符串,输出内容处只需书写“数组名”即可,但要注意数组中存放的是否是字符串。
2) puts函数
puts函数也可实现输出字符串,并且自动将字符串的结束标"\0转换成回车换行符。
#include
void main()
{
char str1[5]={'w','o','r','l','d'};
char str2[6]={'w','o','r','l','d','\0'};
char str3[]="world";
puts(str1);
puts(str2);
puts(str3);
}
2、字符串的输入
字符串的输入可以使用scanf和gets函数实现。
1)scanf函数
(1)按%c的格式,利用循环控制语句
#include
void main()
{
int i;
char str[6];
for(i=0;i<5;i++)
scanf("%c",&str[i]);
str[5]='\0';
puts(str);
}
(2)按%s的格式,将猪粉草的内容输入到字符数组,当输入的字符是“空格”“Tab”或回车键,系统默认输入结束。
#include
void main()
{
char str1[7];
char str2[7];
printf("input str1:");
scanf("%s",str1);
printf("input str2:");
scanf("%s",str2);
printf("str1:%s\n",str1);
printf("str2:%s\n",str2);
}
2)gets函数
可以实现输入字符串到字符数组中,当遇到回车键时,系统默认用户输入结束
#include
void main()
{
char str1[7];
char str2[7];
printf("input str1:");
gets(str1);
printf("input str2:");
gets(str2);
printf("str1:%s\n",str1);
printf("str2:%s\n",str2);
}
字符串处理函数
使用前要包含对应的头文件string.h
strlen(字符数组)——测字符串长度
功能:计算机指定字符串的实际长度(不含字符串结束\0),并返回字符串的长度。
strcat(字符数组1,字符数组2)
功能:将字符数组2中存放的猪粉草连接到字符数组1中存放的字符串尾部,同时删去字符串1的结束标志\0,组成新的字符串,存入字符数组1中。该函数返回的是字符串1的首地址。
strcmp(字符数组)
功能:安装从左到右的顺序依次比较字符数组1和字符数组2对应位置字符ASCII码值,并返回比较结果,
strcpy(字符数组1,字符数组2)
功能:把字符数组2中的字符复制到字符数组1中,结束标志也复制进去。
注意;复制后原有的字符串将被覆盖。
执行下面的程序时,如果输入A,则输出结果是A123
#include
#include
void main()
{
char ss[10]="1,2,3,4,5";
gets(ss);
strcat(ss,"123");
printf("%s\n",ss);
}