数组
定义:由一个或多个相同类型数据组成的集合
特点:内存连续,相同数据类型
1.一维数组
(1)格式
存储类型 | 数据类型 | 数组名【元素个数】 |
int | arr[5] |
(2)数据类型为char时
若直接输入数据为字符,输出%c为字符,若输入数据为字符的ASCII码值,输出%c为字符,输出%d为十进制码值
(3)注意
- arr[0] arr[1]...只有定义数组时,[]里面表示的是元素个数,其他时候都是表示索引
- 数组名也是数组首地址,是地址常量,不能被重新修改,也就是不能在等号左边
(4)数组大小
一个int整型占四个字节
可以使用sizeof(arr)查看数组大小
(5)初始化
1)全部初始化
int arr[5]={97,98,99,100,101};
2)部分初始化(用的比较多,可利用for循环赋值)
未赋值的值为0
①int arr[30]={97,98};
②int arr[30]={};
3)未初始化
未初始化的值为随机值
int arr[30];
arr[0]=5;
arr[1]=6;//循环遍历
补充:对于一位数组a正确的声明包括
#define SIZE 10
int a[SIZE];
部分初始化例程
#include <stdio.h>
int main(int argc, char const *argv[])
{
int arr[5] = {};
for (int i = 0; i < 5; i++)
{
scanf("%d", &arr[i]);
}
for (int i = 0; i < 5; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[15] = {1, 1};
for (int i = 2; i < 15; i++)
{
a[i] = a[i - 1] + a[i - 2];
}
for (int i = 0; i < 15; i++)
{
printf("%d\n", a[i]);
}
return 0;
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[8] = {};
for (int i = 0; i < 8; i++)
{
scanf("%d", &a[i]);
}
int min = a[1];
int max = a[7];
for (int i = 0; i < 8; i++)
{
if (max < a[i])
{
max = a[i];
}
if (min > a[i])
{
min = a[i];
}
}
int sum = 0;
for (int i = 0; i < 8; i++)
{
sum += a[i];
}
sum -= (min + max);
printf("最大值,最小值,平均分为%d %d %d\n", max, min, sum / 6);
return 0;
}
(6)清零函数
bzero
头文件:#include <strings.h>
void bzero(void *s, size_t n);
功能:清空数组
参数:s:数组首地址;n:空间大小sizeof(arr)
返回值:无
memset
头文件:#include <string.h>
void *memset(void *s, int c, size_t n);
功能:把内存空间设置为0,清零
参数:s:数组首地址;c:要设置的值;n:空间大小sizeof(arr)
返回值:数组首地址
除了零以外的数,不好用,一个int占4个字节,memset赋值一个字节一个字节进行赋值,若想置一其实是四个0000 0001,因此不好用。
2.字符数组
用来存放字符串
(1)三种定义方式
- char a[6] = {"hello"} 有多少用多少,提前想好
- char b[] = "hello" 需要多少开辟多少
- char c[33] = "hello" 直接开辟一大块来用
(2)输入输出 char str1[33]={};
输入:三种方式
1)for循环,里面的scanf为%d,有取地址符;
2)直接用scanf,里面为%s,无取地址符
scanf遇到空格或回车默认输入结束,如果需要支持空格,scanf("%[^\n]",str1);
3)gets
输出:三种方式
1)for
2)printf 里面为%s
3)puts