如果对你有帮助,请点个免费的赞吧,谢谢汪。(点个关注也可以!)\n\n如果以下内容需要补充和修改,请大家在评论区交流~
思维导图
1.数组
由一个或多个相同的数据类型组成的集合
特点:
数据类型相同
内存连续
1 . 1 一维数组
格式 :
存储类型 数据类型 数组名[元素个数]
int arr[5];
[n]n:只有在定义时,表示元素个数;其他任何情况下都表示索引
访问 :
数组名[索引]索引从0开始
a[0] 第一个元素
a[4] 第五个元素
int a[5]={5,6,7,8,9};
printf("%d %d %d\n",a[0],a[2],a[4]);
char b[5]={'h','e','l','l','o'};//数据类型保持一致
数组名 :
数组名也是数组的首地址,是一个地址常量,不能为左值(=左边),不能被修改
int a[5]={5,6,7,8,9};
printf("%p %p\n",a,&a[0]); //地址编号一样
数组大小 :
int a[5]={5,6};
数据类型*元素个数 4*5=20
sizeof
printf("%ld\n",sizeof(a));
元素个数:决定数组最多存储数据个数
初始化:
- 全部初始化
int a[5]={5,6,7,8,9};
- 部分初始化
int a[5]={5,6};//56000
未赋值的部分,值默认为0
int a[5]={}; //00000
- 未初始化
inta[5];
值为随机值
a[0]=5;
a[1]=6;
循环遍历 :
int a[5]={};
for(int i=0;i<5;i++)
scanf("%d",&a[i]);
for(int i=0;i<5;i++)
printf("%d\n",a[i]);
打印出输入的这五个数中的最大值
思路:输入完五个数后,假设第一个数最大,暂时为max
把max和剩下的四个依次比较
比较过程中遇见了更大值,对max重新赋值
比较结束,打印max
问题:打印出输入的这五个数中的最大值,及位置,亲们可以试试
内存分配 :
内存连续,地址编号差值取决于数据类型的大小
char 地址差1
int 地址差4
清0函数:
1.bzero
#include <strings.h>
void bzero(void *s, size_t n);
功能:数组元素清零
参数:s:要清零的数组的首地址 n:字节大小
返回值:无
2.memset
#include <string.h>
void *memset(void *s, int c, size_t n);
功能:数组元素清零
参数:s:要清零的数组的首地址 n:字节大小c:要设置的值,设置为0
返回值:清零的数组的首地址
1.2字符数组
用来存储字符串,用" "包裹,以'\0'为结束标志
输入输出 :
- for
for(int i=0;i<5;i++)
scanf("%c",&b[i]);
for(int i=0;i<5;i++)
printf("%c",b[i]);
-
%s
char b[6]={};
scanf("%s",b);
printf("b:%s\n",b);
//输入helloworld时,只有hello赋值成功
//scanf默认遇到空格或回车认为赋值结束
// scanf("%[^\n]",b); -
gets puts
get:
char *gets(char *s);
功能:终端输入字符串
参数:数组首地址
返回值:数组首地址
puts:
int puts(const char *s);
功能:终端输出字符串
参数:数组首地址
返回值:输出字符个数
char b[33]={};
gets(b);
puts(b);
特别的输入输出
#include<stdio.h>
int main(int argc, char const *argv[])
{
char b[33] = {};
int i = 0,num = 0;
scanf("%[^\n]",b);
while (b[i] != '\0')
{
// printf("%c ",b[i]);
if (b[i] == 'y')
{
num++;
}
i++;
}
printf("%d\n",num);
return 0;
}
题目:
3.输出数组中的最大值
1.
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[5] = {};
for (int i = 0; i < 5; i++)
{
scanf("%d", &a[i]);
}
int max = a[0], min = a[0];
for (int i = 1; i < 5; i++)
{
max = max > a[i] ? max : a[i];
min = min < a[i] ? min : a[i];
}
printf("%d\n", max);
return 0;
}
7.打印斐波那契数列前10位:
1.先赋值再打印
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[10] = {1, 1};
for (int i = 2; i < 10; i++)
{
a[i] = a[i - 1] + a[i - 2];
}
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
2.一边赋值一边打印
优化版:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a[10] = {1, 1};
for (int i = 0; i < 10; i++)
{
if (i>=2)
{
a[i] = a[i - 1] + a[i - 2];
}
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
启发:
如果遍历同一个数组遍历2次范围是包含关系,可以内嵌if条件,if内条件为交集的反集
8.bzero(清0的运用)
#include<stdio.h>
#include<strings.h>
int main(int argc, char const *argv[])
{
int a[5] = {99,88};
for (int i = 0; i < 5; i++)
{
printf("%d\n",a[i]);
}
putchar(10);
bzero(a,sizeof(a));//bzero清0
for (int i = 0; i < 5; i++)
{
printf("%d\n",a[i]);
}
return 0;
}
9.memset
#include<stdio.h>
#include<string.h>
int main(int argc, char const *argv[])
{
int a[5] = {22,33};
memset(a,0,sizeof(a));
for (int i = 0; i < 5; i++)
{
printf("%d",a[i]);
}
putchar(10);
memset(a,'c',sizeof(a));
for (int i = 0; i < 5; i++)
{
printf("%c",a[i]);
}
putchar(10);
memset(a,'1',sizeof(a));
for (int i = 0; i < 5; i++)
{
printf("%c",a[i]);
}
putchar(10);
return 0;
}
11。判断如果定义字符串错过后,以下定义方法是否正确
例:判断以下三种赋值方式是否正确
char a[10];
1)a[10]="hello";
2)a="hello";
3)strcpy(a,"hello");
12.练习:
终端输入一个字符串,打印其中'a'出现的次数
#include<stdio.h>
int main(int argc, char const *argv[])
{
char b[33] = {};
int i = 0,num = 0;
scanf("%[^\n]",b);
while (b[i] != '\0')
{
// printf("%c ",b[i]);
if (b[i] == 'y')
{
num++;
}
i++;
}
printf("%d\n",num);
return 0;
}