一维数组
一、数组的概述
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。数组用来储存一组数据,C语言中的数组只能存放一种数据类型的数据,如int、char,存放的数据称为元素。
二、一维数组的定义
定义的形式为:类型 数组名[元素个数]
类型说明符是任一种基本数据类型或构造数据类型。
数组名是用户定义的数组标识符。
例:
int a[10];说明整型数组a,有10个元素。
char ch[20];说明字符数组ch,有20个元素。
注意:
1.数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
2.数组名的书写规则应符合标识符的书写规定。
3.数组名不能与其它变量名相同。
4.[]里面的个数必须是一个固定值,可以是常量(比如6、8)、常量表达式(比如3+4、5*7)。绝对不能使用变量或者变量表达式来表示元素个数,大多数情况下不要省略元素个数(当数组作为函数的形参和数组初始化时除外)
三、一维数组的存储
定义数组时,系统将按照数组类型和个数分配一段连续的存储空间来存储数组元素,如int a[3]占据了连续的6字节存储空间(在16位编译器环境下,一个int类型占用2个字节,32位则4字节)。要注意的是,数组名代表着整个数组的地址,也就是数组的起始地址。
a不算是变量,是个常量,它代表着数组的地址。数组a的地址是ffc1,a[0]的地址是ffc1,a[1]的地址是ffc3,a[2]的地址是ffc5。因此a ==&a[0],即第一个元素的地址就是整个数组的地址
四、一维数组的初始化
初始化的一般形式是:类型 数组名[元素个数] = {元素1, 元素2, ...};
int a[2] = {8,10};
相当于:
int a[2];
a[0] = 8;
a[1] = 10;
元素值列表可以是数组所有元素的初值,也可以是前面部分元素的初值
int a[4] = {2,5};
当数组为整型时,初始化未确定初值的元素,默认为0,所以上a[2]、a[3]都为0
当对全部数组元素都赋初值时,可以省略元素个数
int a[] = {2,5,7};
说明数组a的元素个数是3
注意:数组初始化时的赋值方式只能用于数组的定义,定义之后只能一个元素一个元素地赋值
二维数组
一、二维数组的存储
C语言把二维数组当作是一维数组的集合,即二维数组是一个特殊的一维数组:它的元素是一维数组。例如int a[2][3]可以看作由一维数组a[0]和一维数组a[1]组成,这两个一维数组都包含了3个int类型的元素。二维数组的存放顺序是按行存放的,先存放第一行的元素,再存放第2行的元素。
二、二维数组的初始化
1.按行进行初始化
int a[2][3] = { {2, 2, 3}, {3, 4, 5} };
2.按存储顺序进行初始化(先存放第1行,再存放第2行)
int a[2][3] = {2, 2, 3, 3, 4, 5};
3.对部分元素进行初始化
int a[2][3] = { {2}, {3, 4} };
int b[3][3] = { { }, { , , 2}, {1, 2, 3}};
4.如果只初始化了部分元素,可以省略行数,但是不可以省略列数
int a[][3] = {1, 2, 3, 4, 5, 6};
int a[][3] = {{1, 2, 3}, {3, 5}, {}};
注意:可以省略行数,但不可以省略列数,也不可以只指定行数,省略列数。因为二维数组会先存放第1行的元素,由于不确定列数,也就是不确定第1行要存放多少个元素,所以这里会产生很多种情况,可能1、2是属于第1行的,也可能1、2、3、4是第一行的,甚至1、2、3、4、5、6全部都是属于第1行的
字符串
一、概述
C语言中没有专门的变量来存放字符串。其实字符串就是字符序列,由多个字符组成,所以在C语言中,我们用字符数组来存储字符串。
字符串可以看做是一个特殊的字符数组,为了跟普通的字符数组区分开来,应该在字符串的尾部添加了一个结束标志'\0'。'\0'是一个ASCII码值为0的字符,是一个空操作符,表示什么也不干。所以采用字符数组存放字符串,赋值时应包含结束标志'\0'。
注意,尾部有个'\0',如果没有这个结束标记,说明这个字符数组存储的并不是字符串
字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。
二、字符数组初始化
C语言允许用字符串的方式对数组作初始化赋值,例如:
char s[] = {'y','a','n','g','\0'};
可写为:
char s[] = {"yang"};
或去掉{}写为:
char s[] = "yang";
用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志'\0',\0'是由C编译系统自动加上的。由于采用了‘\0'标志,所以在用字符串赋初值时一般无须指定数组的长度,而由系统自行处理。
三、字符串数组
1.比如需要储存一个班学生的名字,可以采用字符串数组,charnames[15][20]可以存放15个学生的姓名(假设姓名不超过20字符),如果要存储两个班的学生姓名,那么可以用三维字符数组char names[2][15][20]
2.字符串数组的初始化
char names[2][10] = { {'J','a','y','\0'}, {'J','i','m','\0'} };
char names2[2][10] = { {"Jay"}, {"Jim"} };
char names3[2][10] = { "Jay", "Jim" };
可以把字符串数组看作是一维数组,它的元素是字符串。字符串数组names由字符串"Jay"和字符串"Jim"构成。
四、字符串处理函数
1.printf()输出
#include <stdio.h>
int main()
{
char s[]="yang";
printf("%s",s);
}
%s
为字符串格式
2.puts()输出
#include <stdio.h>
int main()
{
char s[]="yang";
puts(s);
}
也能输出字符串
3.scanf输入
char a[10];
scanf("%s", a);
scanf
函数会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记\0
4.gets输入
从键盘输入字符串
char a[10];
gets(a);
gets
跟scanf一样,会从a的首地址开始存放用户输入的字符,存放完毕后,系统会自动在尾部加上一个结束标记\0。
gets一次只能读取一个字符串,scanf则可以同时读取多个字符串
gets可以读入包含空格、tab的字符串,直到遇到回车为止;scanf不能用来读取空格、tab
5.测字符串长度函数strlen
格式:strlen(字符数组名)
功能:测字符串的实际长度(不含字符串结束标志‘\0’) 并作为函数返回值。
#include <string.h>
#include <stdio.h>
int main()
{
int c;
char st[]="C language";
c=strlen(st);
printf("The lenth of the st is %d\n",c);
}
6.
字符串连接函数strcat
格式:strcat(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志“\0”。本函数返回值是字符数组1的首地址。
#include <string.h>
#include <stdio.h>
int main()
{
char st1[30]="string is ";
char st2[10];
printf("input string:\n");
gets(st2);
strcat(st1,st2);
puts(st1);
}
程序把初始化赋值的字符数组与动态赋值的字符串连接起来。要注意的是,字符数组1应定义足够的长度,否则不能全部装入被连接的字符串。
7.字符串拷贝函数strcpy
格式:strcpy(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。
字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。
#include <string.h>
#include <stdio.h>
int main()
{
char st1[15]="s";
char st2[]="c-language";
strcpy(st1,st2);
puts(st1);
}
8.
字符串比较函数strcmp
格式:strcmp(字符数组名1,字符数组名2)
功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
字符串1=字符串2,返回值=0;
字符串1>字符串2,返回值>0;
字符串1<字符串2,返回值<0。
本函数也可用于比较两个字符串常量,或比较数组和字符串常量。
#include <string.h>
#include <stdio.h>
int main()
{
int c;
char st1[15],st2[]="c-language";
printf("input a string:\n");
gets(st1);
k=strcmp(st1,st2);
if(c==0) printf("st1=st2\n");
if(c>0) printf("st1>st2\n");
if(c<0) printf("st1<st2\n");
}