数组
一、数组的概念
1、数组是多个元素的组合。
2、数组内的所有元素数据类型必须相同。
3、每个元素在数组中都有一个下标,用来表示它在数组中的序号,下标从0开始计算。
4、数组的容量不能改变。
二、数组的定义
同其他变量一样,数组也是要先定义再使用。
int a[8]; //表示定义了一个名为a的数组,这个数组中,含有8个元素,每个元素的数据类型均为整形变量,每个元素占四个字节的存储空间
a[0]=1; //表示将a数组中的第一个元素赋值为1
三、数组的初始化
在定义一个数组的同时,就设置数组内元素的值。注意使用大括号
情况一:
#include <stdio.h> int main() { int a[8] = { 0,1,2,3 }; printf("a[0]=%d,a[1]=%d,a[2]=%d,a[3]=%d,a[4]=%d,a[5]=%d,a[6]=%d,a[7]=%d\n", a[0], a[1],a[2],a[3],a[4],a[5],a[6], a[7]); return 0; }
a[0],a[1],a[2],a[3]分别初始化为0,1,2,3,其他值均初始化为0
情况二:
#include <stdio.h> int main() { int a[] = { 0,1,2,3 }; printf("a[0]=%d,a[1]=%d,a[2]=%d,a[3]=%d\n",a[0], a[1],a[2],a[3]); printf("数组a所占的字节数为:%d 数组a的元素个数为:%d", sizeof(a), sizeof(a) / sizeof(a[0])); return 0; }
定义数组a,这个数组包含4个元素
注意初始化时使用情况二,在只定义而没有初始化值时不能使用。
初始化的常见错误
1、初始值太多,超出数组容量
2、不能对数组名直接赋值,如:
char a[8];
a={'a','b','c','d'};//是不正确的
3、下标不能越界
四、数组的访问
通过“数组名[下标]”访问,注意下标从0开始,不要越界,越界是指下标超出正常的范围
五、字符串的存储
情况一:
#include <stdio.h> int main() { char a[10] = "China"; printf("a=%s\n", a); return 0; }
情况二:
#include <stdio.h> int main() { char a[] = "China"; printf("%d\n", sizeof(a)); return 0; }
注意字符数组最后一个字符的后面会存储一个0作为字符串结束符。
六、字符串的输入
1、scanf
从第一个非空白字符开始读取,直到读到空白字符为止(不包括空白字符)
数组名本身表示一个地址,所以数组名前不需要加取地址符号&
#include <stdio.h> int main() { char a[16]; scanf("%s",a);//输入hello world,会输出hello printf("a=%s", a); return 0; }
缺点:
1、不能读取空格、制表符,因为被当作分隔符被处理了
2、容易导致越界
2、gets
遇到回车符结束,相当于读取一行,不包括行尾的回车符
能够读取回车符、制表符,但不能读取回车符
使用方便
格式:gets(字符数组名);
#include <stdio.h> int main() { char a[16]; gets(a);//输入hello world,会输出hello world printf("a=%s", a); return 0; }
缺点:容易导致越界
3、fgets
能够有效防止越界的问题,非常安全,能够读取回车符
格式:fgets(字符数组名,n,stdin); //n表示字符数组的容量,一般写为sizeof(字符数组名),stdin表示标准输入设备。即表示从标准输入设备中最多读取n-1个字符,因为字符结束符也占一个字节的存储空间
情况一:
#include <stdio.h> int main() { char a[8]; fgets(a,8,stdin);//输入hello world,会输出hello w printf("a=%s", a); return 0; }
情况二:
#include <stdio.h> int main() { char a[16]; fgets(a,16,stdin); printf("a=[%s]\n", a); return 0; }