
定义:数组是一组相同数据类型有限个数据的集合。
数组存储的性质:
- 单一性:存储的数据类型相同。
- 连续性:存储在一片连续的内存区域。
- 有序性:按顺序存放数据。
一、一维整型数组
eg:int a[10]; 会开辟内存空间
形式:数据类型 数组名[元素的个数];
- 数据类型:基础数据类型,不能是void
- 数组名:字母、数字、下划线,不能以数字开头
- 元素的个数:常量或常量表达式(以Windows为准,Windows只能识别常量,GNU gcc支持变量)
初始化:
//局部初始化,全部初始化为0
int a[5]={0};
//全部初始化,{1,2,3,4,5}称为初始化列表
int a[5]={1,2,3,4,5};
//局部初始化,剩下的补充0
int a[5]={1,2,3};
//默认初始化,系统根据输入的元素个数,开辟对应的数组空间
int a[]={1,2,3,4,5};
数组空间:基类型的空间大小*元素的个数。
- 求元素个数:
len=sizeof(a) /sizeof(a[0]);
数组的类型:
int a[10];//数组a,类型为int[]
int b=10;//变量b,类型为int
数组访问:访问是对数组进行读或写的操作,下标值从0开始,到元素的个数-1。
- 下标:常量、变量、表达式都可以。下标不能超出数组范围。
int a[5];
//定义数组,这里的[]为数组
a[0]=1;
//写,这里的[]为运算符,称为下标运算符
c=a[2];
//读
注意:整形数组不能整体输入输出。只能通过访问读写数组空间。
数组的遍历操作:
把数组中所有的元素依次访问,有且只有一次访问,一般需要配合循环使用(一维用一个for循环,二维用双层for循环)。
int a[5]={0};
int len = sizeof(a)/sizeof(a[0]); //获得数组元素的个数
int i = 0 ;
for(i=0;i<len;i++)
{
printf("a[%d]=%d\\n",i,a[i]);
}
二、二维整型数组
二维整型数组由多个一维整形数组组成。
形式:数据类型 数组名[行数][列数];
eg:int a[3][5]; //a是一个二维数组,表示a里有三个元素,每一个元素是可以存储5个整型变量的一维整型数组。
数据类型:a的类型为int[ ][ ],a[0]的类型为int[ ],a[0][0]的类型为int
初始化:
//全部初始化
int a[2][3]={{1.2.3},{4,5,6}};
int a[2][3]={1,2,3,4,5,6};
//部分初始化
int a=[2][3]={0};// 全部初始化为0
int a=[2][3]={{1,2},{4}};// 剩下的部分补0
//默认初始化
int a=[ ][3]={{1,2,3},{1}};//只有前面的可以空,系统会根据输入的元素个数开辟空间
存储空间:数组空间大小=基类型空间大小*行数*列数
- 行数=sizeof( a )/ sizeof( a[0] );
- 列数=sizeof( a[0] ) / sizeof( a[0][0] );
三、一维字符数组
一维字符数组用来存储字符串。
形式:数据类型(char) 数组名[元素个数];
- 数据类型:只能为char类型。
- 元素个数:字符串必须以' \\0 '结尾,所以开辟空间除了字符的个数外,还需要一个' \\0 '的空间
初始化:
//全部初始化
char str[6]={'h','e','l','l','o','\\0'};//输入单个字符后需加'\\0'
char str[6]={“hello”};//用双引号括起来的为字符串,自带'\\0'
char str[6]=“hello”;
//部分初始化
char str[10]={"hello"};//剩下的部分填'\\0',存储为ASCII码0
//默认初始化
char str[]={"hello"};//系统自动开辟6个空间
访问:
字符数组写入:
//字符串整体写入,可以在初始化时整体写入
char str1[20]={"hello"};
//错误,字符串赋值不能整体赋值
char str1[20]={0};
str1={"hello"};
- 整型数组不能整体操作,字符数组可以整体输入输出,但不能整体赋值。
- scanf(“%s”,str);// str数组不用&取地址,因为数组( char[ ] )存储的就是单元格地址。
四、二维字符数组
由多个一维字符数组组成,可以存储多个字符串的数组。
语法:char 数组名[行数][列数] ; (行,列,必须是整形常量)
eg:char strs[3][50];//strs中有3个元素,每个元素是一个可以存储50个元素的一维字符数组。
类型:strs–>char[ ][ ]类型,strs[ ]–>char [ ]类型,strs[ ][ ]–>char类型
初始化:
char strs2[3][50]={0};// 常用,剩余的补0
char strs3[3][50]={{0}};
char strs[3][50]={"how","are","you"};
char strs1[3][50]={{"how"},{"are"},{"you"}};
//默认初始化,只有一维数可以空
char strs4[][50]={"hello","are","you"};
访问:
- 读:依次输出一维数组a[i]
//行数
line = sizeof(strs)/sizeof(strs[0]);
for(i=0;i<line;i++)
{
printf("%s\\n",strs[i]);//二维数组不能整体输出,只能依次输出一维数组
}
- 写:用strcpy函数赋值给一维数组a[i]
strcpy(strs[0],"aaa");
数组常用算法
1. 倒置
方法:把第一个数跟最后一个数交换,第二个数跟倒数第二个数交换……一共循环(len/2)次
for(i=0;i<len/2;i++)
{
t=a[i];
a[i]=a[len-1-i];
a[len-1-i]=t;
}
2.排序
排序:把一个数组按照特性规则(默认从小到大)进行排列位置。方便查找
- 升序,从小到大
- 降序 ,从大到小
2.1 冒泡排序
方法:
- 外层循环:每一次找到一个最大值,然后放到最后的对应位置。
- 内层循环:相邻数字依次比较。
for(j=len-1;j>0;j–) //外层循环执行(len-1)次
{
for(i=0;i<j;i++) //内层循环执行j次
{
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
}
}
2.2 选择排序法
方法:
- 外层循环:每一次找到一个最小值,然后放到最前面的对应位置。
- 内层循环:把第一个数依次跟后面的数比较。
for(i=0;i<len-1;i++) //找最小值,放到最前面的对应位置
{
for(j=i+1;j<len;j++) //把第一个数依次跟后面的数比较
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
扩展一个随机数的头文件#include<stdlib.h>
时间戳的头文件#include<time.h>
随机数需要一个不断变化的参考点,这里以时间为参考点
srand(time(NULL));
r=rand();//随机给r赋值
时间戳是计算机系统一个规定的时间,从1970年1月1日开始计时。
网硕互联帮助中心





评论前必须登录!
注册