数组
特点:
内存连续
数据类型相同
分类:
一维数组
格式:存储类型 数据类型 数组名[元素个数]
auto int arr[5];
1.访问时,索引从0开始
2.char a[5]={97,98,99,100,101};
输出是a,b,c,d,e(自动与ascii码联系)
3.数组名也是首地址
4.字节大小:
例int a[5]; 字节数4*5=20
sizeof(a);
5.初始化:
完全初始化: int a[5]={2,3,5,8,9};
部分初始化:
int a[5]={9},其余部分为0;
int a[5]={};全为0;
未初始化:
int b[33];值为随机值;
6.数组遍历
for(int i=0;i<5;i++)
{
printf("%d\n",a[i]);
}
7.清零函数
7.1bzero
#include <strings.h>
void bzero(void *s, size_t n);
功能:清空数组
参数:数组首地址,n:清空的字节大小
返回值:无
7.2memset
#include <string.h>
void *memset(void *s, int c, size_t n);
功能:清空数组
参数:数组首地址,c替换的数据,n:清空的字节大小
返回值:数组首地址
8.字符数组
字符数组存放字符串
字符串结束标志’\0’ 而单纯字符则没有’\0’(重要)
如char a1[]={‘a’,‘b’,‘c’} 数据类型是字符型,sizeof(a1)==3
而char a2[]={“abc”} 数据类型是字符串型,sizeof(a2)==4 要加上’\0’
char a[6]={“hello”}; //sizeof(a) 6
char b[6]=“hello”; // 6
char c[]=“hello”; //6
char d[33]=“hello”; //33
数组的空间大小:若已明确数组大小,则空间就为多大。若没明确如c[],则输入字符串就多一个’\0’,但字符不多;
9.输入输出
输入方法:
char a[99];
1.scanf("%s",a);//输入的字符串不包括空格
改进:scanf("%[^\n]",a);//可以输入空格
2.gets(a);//可以输入空格
//功能:从终端输入字符串
//参数:目标字符串的首地址
//返回值:目标字符串的首地址
3.char a[]="abc jkasd";//直接定义输入;
输出方法:
1.for(int i=0;i<sizeof(a);i++)
printf("%c",a[i]);//单个输出字符
2.printf("%s",a);//整个输出字符串
3.puts(a); //功能:向终端输出字符串
//参数:字符串首地址
//返回值:输出字符个数
strcpy(s,“string”) (实现将字符串添加到字符数组中,从首地址开始);
10.计算字符串实际元素个数
strlen
#include <string.h>
size_t strlen(const char *s);
功能:计算字符串实际元素个数
参数:字符串首地址
返回值:实际元素个数
sizeof和strlen的区别:
- sizeof是关键字,strlen是函数
- sizeof计算实际开辟的空间大小,strlen计算字符串实际元素个数
- sizeof计算包括’\0’,strlen不包括,chara[]=“hello”;
注意 strlen中‘\t’算字符,'\‘表示\字符。。。’\0’才不计算
重要应用
冒泡排序:
#include<stdio.h>
#include<string.h>
#define N 5
int main(int argc, char const *argv[])
{
int n,a[100];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n-1;i++)//循环n-1次
for(int j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1]) //当数组中前一个大于后一个时交换
{
int t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(int i=0;i<n;i++) //输出数组元素
printf("%d ",a[i]);
return 0;
}
冒泡2(效率更高,全部排完结束即停止,不用再多循环):
#include<stdio.h>
int main(int argc, char const *argv[])
{
int n,a[100],bound,exchange;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
bound=n;
while(exchange!=0)
{
exchange=0;
for(int i=0;i<bound-1;i++)
{int t;
if(a[i]>a[i+1]){
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
exchange=i+1;
}
}
bound=exchange;
}
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
选择排序:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int n,a[999];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]); //输入数据
for(int i=0;i<n-1;i++)
{ int flag=i; //标记最小值位置
for(int j=i+1;j<n;j++)
{
if(a[flag]>a[j])flag=j; //若出现更小值,标记更新
}
if(flag!=i) //判断最小值位置是否变化,若有变化则交换 //若有变化 ,则交换
{
int t;
t=a[i];
a[i]=a[flag];
a[flag]=t; //最小值与当前值交换
}
}
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}