目录
1、一维数组
2、二维数组
3、字符数组
1、字符数组的初始化
2、字符数组的输入输出
3、字符数组的存放方式
参考书籍《算法笔记》
数组就是把相同数据类型的变量组合在一起而产生的数据集合。众所周知,每个变量在内存中都有对应的存放地址,而数组就是从某个地址开始连续若个位置形成的元素集合。
格式定义如下:
数据类型 数组名[数组大小];
注意:数组大小必须是整形常量,不可以是变量。来来来,我们列举几个
int a[10];
double ab[233];
char str[60];
这样就可以把int a[10]理解为定义了十个int型数据,且以下面的格式访问;
数组名称[下标]
还需要知道,在定义了长度为size的一维数组后,只能访问下标0~size-1的元素。(一开始学数组,这个老好忘了)。
下面来说一下 一维数组的初始化,一维数组的初始化,需要给出用逗号隔开的从第一个元素开始的若干个元素的初值,并用大括号括住。后面为被赋值的将会由不同的编译器内实现的不同而被赋以不同的值,一般为0咯。
#include
int main()
{
int a[10] = { 2,3,4,5,6 };
for (int i = 0; i < 10; i++)
{
printf("%d\n", a[i]);
}
return 0;
}
上面程序对数组a的前五个元素进行了赋值,而后面没有赋值的部分默认赋为0,所以如果想让整个数组a为0,只需要a[10]={0};即可,或者直接一个大括号也行。
数组中每个元素都可以被赋值、运算,可以被当做普通变量进行相同的操作。如果根据一些条件,可以不断让后一位的结果由前一位或前若干位计算得来,那么这种做法称为递推,递推可以分为顺推和逆推两种。
来了来了 例题。
下面程序输入a[0],并将数组中后续元素都赋值为前一个元素的两倍的功能,是顺推哈
#include
int main()
{
int a[10];
scanf("%d", &a[0]);
for (int i = 1; i < 10; i++)
{
a[i] = a[i - 1] * 2;
}
for (int i = 0; i < 10; i++)
{
printf("a[%d]=%d\n", i, a[i]);
}
return 0;
}
二维数组听名字不就是一维数组的扩展嘛,格式来了:
数组类型 数组名 [第一维大小][第二维大小];
下面那不就来几个例子咯。
int a[5][6];
double b[10][10];
char c[23][23];
二维数组中元素的访问与一维数组类似,只需要给出第一维和第二维数组的下标;
数组名[下标][下标];
注意注意:对于定义为int a[size1][size 2]的二维数组,其第一维是下标取值只能是0~(size 1)-1,其二维的下标取值范围只能是0~(size 2)-1。
来来来 例题。
#include
int main()
{
int a[5][6] = { {2,3,4},{8,4}, {},{1,2,3,4,5} };
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 6; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
看到了吧,与一维数组是不是差不多啊,默认为0咯。
来来来 再来一道例题。
将两个二维数组对应的元素的元素相加,并将结果存放到另一个二维数组中:
#include
int main()
{
int a[3][3], b[3][3];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d", &a[i][j]);
}
}
printf("\n");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d", &b[i][j]);
}
}
printf("\n");
int c[3][3];
printf("\n");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
c[i][j] = a[i][j] + b[i][j];
printf("%d ", c[i][j]);
}
printf("\n");
}
return 0;
}
那多维数组,就是维度高于二维数组。其实与二维数组类似,只是把维度增加了若干维嘛,使用方法和二维数组基本无二嘛。但用到的比较少哎。
和普通数组一样,字符数组也可以初始化,其方法也相同咯,实例如下:
#include
int main()
{
char str[15] = { 'G','o','o','d',' ','s','t','o','r','y','!' };
for (int i = 0; i < 11; i++)
{
printf("%c", str[i]);
}
return 0;
}
是不是,觉得这样初始化用到费事啊!所以,字符数组也可以直接赋值字符串来初始化。
#include
int main()
{
char str[15] = "Good story!";
for (int i = 0; i < 11; i++)
{
printf("%c", str[i]);
}
return 0;
}
字符数组就是char数组,当维度是一维时可以当作“字符串”。当维度是二维时可以当作字符串数组,即若干字符串。字符数组的输入除了scanf外,还可以用getchar或者gets,其输出除了使用printf外,还可以用putchar或者puts。那下面我们浅介绍一下吧!
(1) scanf 输出,printf 输出
scanf对字符串类型有 %c 和 %s 两种格式(printf 同理),其中%c用于输入单个字符,%s用于输入一个字符串并存在字符数组里。%c格式能够识别空格跟换行并将其输入,而%s通过空格或换行来识别一个字符串的结束。示例如下:
#include
int main()
{
char str[10];
scanf("%s", str);
printf("%s", str);
return 0;
}
是不是我输入 TAT TAT TAT,就输出TAT。(你看看 你看看)
(2)getchar 输入 和 putchar 输出
来来来 举个二维数组的例子吧。
#include
int main()
{
char str[5][5];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
str[i][j] = getchar();
}
getchar();//这里是为了把输入中的每行末尾的换行符吸收掉,在牛客网刷题1 我有说过
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; i < 3; j++)
{
putchar(str[i][j]);
}
putchar('\n');
}
return 0;
}
(3)gets 输入,puts 输出
gets用来输入一行字符串(注意:gets识别换行符\n作为输入结束,因此scanf 输完一个完整的数后,如果要使用gets,需要先用getchar 接收整数后的换行符,上面的那个例题里就有),并将其存放于一维数组(或二维数组的一维)中;puts 用于输出一行字符串,即将一维数组(或二维数组的一维)在界面上输出,并紧跟一个换行。示例如下:
#include
int main()
{
char stra[20];
char strb[5][10];
gets(stra);
for (int i = 0; i < 3; i++)
{
gets(strb[i]);
}
puts(stra);
for (int i = 0; i < 3; i++)
{
puts(strb[i]);
}
return 0;
}
这段代码 通过gets(stra)将第一个字符串存入字符数组stra中,然后通过for循环将后三个字符串分别存入strb [0]、strb[1]、strb[2]中。之后使用puts来这些字符串原样输出。
由于字符数组是由若干个 char 类型的元素组成,因此字符数组的每一位都是一个 char 字符。除此之外,在一维数组(或二维数组的第二维)的末尾都有一个空字符\0,以表示存放的字符串的结尾。空字符\0在使用gets或scanf输入字符串时会自动添加在输入字符串后面,并占用一个字符位,而 puts 与 printf 就是通过识别\0作为字符串的结尾来输出的。
特别提醒1:结束符\0的ASCII码为0,即空字符NULL,占用一个字符位,因此开字符数组的时候千万要记住字符数组的长度一定要比实际存储字符串的长度至少多1。注意:int 型数组的末尾不需要加\0,只有char型数组需要。还需要知道空格与\0可不是一个东西哟,空格的ASCII码为32呢。
特别提醒2:如果不是使用scanf 函数的%s格式或gets函数输入字符串(例如使用getchar),请一定要在输入的每一个字符串后加入“\0”,否则printf和puts输出字符串会因此无法识别字符串末尾而输出一大堆乱码。