学习了本章的内容后,对数组有了一个大概的认识。对数组的了解可分为以下几个层次。
数组就是分配一系列的内存空间,方便的把多个数值定义给一个变量,这个变量相当于一排房子,每间房间放一个数值,一个房间代表一个元素,房间里放的不一定是整数,也可以是小数,浮点数,字符等。房间上有门牌号,门牌号就代表了数组中的第几个元素,如a[10]就代表了数组从零开始数的第十一个元素。数组大大省去了为数值一个个赋变量的麻烦。
定义数组的格式:dataType arrayName[length]
dataType 是数据类型, arrayName 是数组名称 ,length是数组长度
注:我们一般会通过for循环结构为数组的每个元素赋值,也会通过循环结构输出数组。
#include
int main()
{
int ha[10];
int i;
//从键盘输入整数赋值给数组中的每个元素
for (i = 0; i<10; i++)
{
printf("请输入整数:");
scanf("%d",&ha[i]);
}
//依次输出数组元素
for (i = 0; i<10; i++)
{
printf("%d ", ha[i]);
}
return 0;
}
运行结果如下:
dataType arrayName[length1][length2];
dataType 是数据类型, arrayName 是数组名称 ,length1是第一维下标的长度,length2是第二维下标的长度,可间接的将数组看成一个excel表格。
初始化可按行分段赋值,也可按行连续赋值。在C中,二维数组是按行排列的。
按行分段赋值:int a[2][3]={{1,2,3},{2,3,4}};
按行连续赋值:int a[2][3]={1,2,3,2,3,4};
另外,二维数组初始化注意以下几点
(1)可以只对部分元素赋值,未赋值的元素的值为0。
(2)如果对全部元素赋值,那么第一维长度可以不给出。即全部元素个数除以第二维元素个数。
(3)二维数组可以看做是由一维数组嵌套而成的。
用来存放字符的数组称为字符数组。字符数组实际上是一系列字符的集合,也就是字符串。在C中,通常就用一个字符数组来存放于一个字符串。
注意:字符数组只有在定义时才能将整个字符串一次性得赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。
例:char str[7];
str = “abc123”;//这是错误的写法
//应该为如下正确写法
str[0] = ‘a’; str[1] = ‘b’;…
在C中,字符串总是以’/0’作为结尾,所以’/0’也被称为字符串结束标志,或者字符串结束符。由“ ”包围的字符串会自动在末尾添加’/0’。所以字符数组的长度至少要比字符串的长度大1.
字符串长度就是字符串包含了多少个字符(不包括最后的’/0’)。在C中,我们使用string.h头文件的strlen()函数来求字符串的长度,用法如下:
length strlen(strname);
strname是字符串的名字。
puts():输出字符串并自动换行,只能输出字符串。
printf():通过格式控制符%s输出字符串,不能自动换行。
#include
int main()
{
char str[] = "hello.lipanpan";
printf("%s\n", str); //通过字符串名字输出
printf("%s\n", "hello.lipanpan"); //直接输出
puts(str); //通过字符串名字输出
puts("hello.lipanpan"); //直接输出
return 0;
}
注意:输出字符串时只需要给出名字,不能带后边的【】。
scanf():通过格式控制符%s输入字符串。
gets():直接输入字符串,只能输入字符串。
注意:scanf()和gets()还是有区别的,gets会把空格作为字符串的一部分,一起输入,只有碰到回车键才代表输入结束,而scanf()则是碰到空格键就代表输入结束。
举个简单例子:
```cpp
#include
int main()
{
char a[20],b[20];
//用gets输入
printf("请输入一串字符:");
gets(a);
//用scanf输入
printf("请输入一串字符:");
scanf("%s",b);
printf("\n");
printf("a:%s\n",a);
printf("b:%s\n",b);
return 0;
}
从该段程序中可以看出,我本想利用gets()和scanf()输入的内容一致,但是在运用scanf方法中,my后面敲了个空格,程序就认为我已输入完成。所以这个简单的例子很好的区分了这两个方法的区别。
int、char、float等类型的变量用于scanf()时都要在前面加&,而数组或字符串不需要,他们本身就会转换为地址。
使用其他字符串函数要包含头文件 string.h,这个头文件包含了很多字符串处理函数,是专门用来处理字符串的头文件。
功能:将两个字符串拼接在一起
格式:strcat(arrayName1,arrayName2);
讲解: strcat()把arrayName2连接到arrayName1后面,并删除原来arrayName1最后的结束标志“/0”。这意味着,arrayName1 必须足够长,要能够同时容纳 arrayName1 和 arrayName2,否则会越界(超出范围)。strcat() 的返回值为 arrayName1 的地址。
功能:将字符串从一个地方复制到另外一个地方。
格式:strcpy(arrayName1, arrayName2);
讲解: str2 复制到 str1 后,str1 中原来的内容就被覆盖了,strcpy() 要求 arrayName1 要有足够的长度,否则不能全部装入所拷贝的字符串。
功能:字符串的比较
格式:strcmp(arrayName1, arrayName2);
讲解:字符本身没有大小之分,strcmp() 以各个字符对应的 ASCII 码值进行比较。strcmp() 从两个字符串的第 0 个字符开 始比较,如果它们相等,就继续比较下一个字符,直到遇见不同的字符,或者到字符串的末尾。
数组是一系列相同类型的数据的集合,可以是一维的、二维的、多维的;最常用的是一维数组和二维数组,多维数组较少用到。
type 为数据类型,arrayName 为数组名,length 为数组长度。
需要注意的是:
1.数组长度 length 最好是常量表达式,如果 length 中包含了变量,在某些编译器下就会报错。
2.数组是一个整体,它的内存是连续的;
3.一般情况下,数组名会转换为数组的地址,需要使用地址的地方,直接使用数组名即可。