【1】数组
1. 概念:具有一定顺序的若干变量的集合
2. 定义格式:
存储类型 数据类型 数组名[元素个数];
int arr [5];
数组名:代表数组的首地址,地址常量,不能为左值
访问元素:数组名[下标], 下标从0开始,到n-1;
// 数组越界问题需要注意!!!
3. 特点:
1)数据类型相同
2)内存连续
4. 注意:
1. 数组的类型就是数组元素的数据类型
2. 数组名符合标识符命名规则
3. 同一个函数中,数组名不能和其他变量名相同
4. 【】下标从0开始到n-1结束
一维数组
1.格式:存储类型 数据类型 数组名[元素个数];
int arr[5];
数组名:代表数组的首地址,地址常量,不能为左值
访问元素:数组名[下标], 下标从0开始,到n-1;
数组越界问题需要注意!!!
2.初始化:
1)全部初始化:
int a[5]={1,2,3,4,5};// 1 2 3 4 5
2)部分初始化:未被赋初值的元素值为0
int a[5]={1,2,3};//1 2 3 0 0
3)未初始化:只能单个赋值,未被赋初值的元素值为随机值
int a[5];
a[0]=1;
a[2]=3;//1 随机 3 随机 随机
定义空数组:
int a[5]={0,0,0,0,0};
int a[5]={0};
int a[5]={};
3.引用
1)先定义向后引用
2)每次只能引用数组的一个元素a[i],如果想要引用所有元素,可以for循环遍历
3)防止数组越界
4)打印数组元素地址,%p
4.内存分配
5. 数组遍历
for循环,把元素下标作为循环变量,循环范围就是0~n-1
6. 数组的大小
sizeof(数组名)
数据类型的大小*元素个数
练习:计算斐波那契数列前15项并逆序输出
1 1 2 3 5 8 13 21 .....
【2】清零函数
1.#include <strings.h>
void bzero(void *s, size_t n);
功能:将内存空间置零
参数:s:要清空内存的首地址
n:要清空字节数
返回值:无
例子:int a[5]={1,2,3,4,5};
bzero(a,sizeof(a));//以地址a开始,将sizeof(a)个字节清空为0
2. #include <string.h>
void *memset(void *s, int c, size_t n);
功能:将内存空间设置为0
参数:s:要清空内存的首地址
c:要设置的值,0》》只能为0
n:要清空字节数
返回值:要清空内存的首地址
例子:int a[5]={1,2,3,4,5};
memset(a,0,sizeof(a));//以地址a开始,将sizeof(a)个字节设置为0
【3】字符数组
1. 存在三种形式
1) char a[]={'a','b','c'};//sizeof(a)==3,单个字符赋值
2) char b[]={"abc"};//sizeof(b)==4,字符串赋值
3) char c[]="abc";//sizeof(c)==4,字符串赋值
注意:字符串赋值经常容易忽略数组的长度,一定要注意数组越界!!!
2. 输入输出
输入:char buf[32]={};
1) scanf("%s",buf);//遇到空格或\n都会认为字符串输入完成,结束
scanf("%[^\n]",buf);//直到遇到\n才会结束,字符串可以包含空格
2) gets
char *gets(char *s);
功能:从终端获取字符串
参数:s:目标数组的首地址
返回值:同参数、
//gets不会检查数组越界
练习1:输入一串字符,计算其中空格个数
输入一个字符串
遍历字符数组
判断每一个元素是否等于空格
如果相等就变量+1
打印变量的值
输出:
1) printf("%s",buf);//打印到\0为止
2) puts
int puts(const char *s);
功能:向终端输出字符串
参数:s:要输出字符串的首地址
返回值:输出字符的个数(包括\0)
例题:
char s[10]={};
判断对错:
1) s[10]="hello";//错误,越界(除定义位置外,其余地方出现均为下标)
2) s="hello";//错误,地址常量不能被赋值
练习2:将一串字符串进行倒置,例如:char buf[32]=”hello”;//olleh
#include<stdio.h>
int main(int argc, char const *argv[])
{
char buf[32]="hello";
char t;
int n,i;
for(n=0;buf[n] != '\0';n++);//n==5,实际个数
for(i=0;i<n/2;i++)//交换n/2次
{
t = buf[i];
buf[i] = buf[n-1-i];
buf[n-1-i] = t;
}
printf("%s\n",buf);
return 0;
}
计算字符串实际长度:
1. 通过for循环,直到\0为止
2. #include <string.h>
size_t strlen(const char *s);
功能:计算字符串实际长度,不计算\0
参数:s:要计算的字符串首地址
返回值:实际长度
例如:char buf[32]="hello";
int t = strlen(buf);//t == 5
区分strlen和sizeof
1. strlen是函数;sizeof是关键字
2. strlen是用来计算字符串的实际长度;sizeof计算数据所占空间大小
3. strlen不计算\0,sizeof计算\0,字符数组省略元素个数时,sizeof比strlen大1
char a[]="hello";
sizeof(a)=6
strlen(a)=5
char a[32]="hello";
sizeof(a)=32
strlen(a)=5
作业:
1. 在终端输入大写字母、小写字母、空格、数字,分别在终端输出他们的个数
2. 编写一个程序,找出1000以内所有的完数,所谓完数就是一个数恰好等于它的因子之和,
例如6=1+2+3,6就是一个完数。