定义:一次性定义多个相同类型变量,存储到一片连续的内存中(有序存放)。
数据数组
初始化
int为数组类型(除了函数其他类型均可以放入),3为数组的内存空间,每块内存空间四个字节,“一个萝卜一个坑”
int a[3] = {1,2,3}; 定义语句,方括号内为元素个数,必须为整型,可以存放符号常量和常量表达式。如:1024*768
//不种满也可以
int a[3] = {1,2};
//默认空间为3
int a[] = {1,2,3}; //柔性数组
//数组打印
for(int i = 0; i < 3; i++)
{
printf("%d\n",a[i]); 引用语句,方括号内为偏移量 max(i) = 3-1
}
<!--注意:数组赋值`a = 10`-->
数组若未初始化,则内部全为随机数。
int/float/double
型数组:若从第一个开始往后赋值部分,则后续自动赋值为0/0.000000,直接赋值后面部分,则前后均为随机数(只有double
会前后1均赋值为0.000000)。
sizeof(a)/sizeof(a[0])
用数组总字节数除以每一个元素来求得数组中元素个数。
printf("%s",strcat(name,"abc")); //将abc追加到name后面
案例1:斐波那契数列
int n = 0; //用于对数组申请内存大小
printf("请输入一个数(代表即将要输出的数据个数):\n");
scanf("%d",&n);
int a[n];
a[0] = 1;
a[1] = 1;
for(int i = 0; i < sizeof(a) / sizeof(a[0]) - 2; i++)
{
a[i+2] = a[i] + a[i+1];
}
for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
if(i % 3 == 0)
{
printf("\n");
}
printf("%9d",a[i]);
}
printf("\n");
案例2:冒泡排序
思想:
1.一次排好一个数,假设有n个数,最差要n-1次;
2.每次排序两两进行比较,选择是否进行交换;
3.在余下的数中,再进行第二步操作,直到只剩下一个数;
int t = 0, n = 0;
printf("输入一个整数(代表你接下来要输入数据的个数):\n");
//给后续数组确定申请内存空间大小,并对缓冲区做处理
int ret = scanf("%d",&n);
if(ret != 1 || n <= 0)
{
printf("输入数据有误!\n");
while(getchar() != '\n');
}else{
printf("现在你可以输入%d个数据进行排序:\n",n);
}
int a[n];
//数组数据输入
for(int i = 0; i < n; i++)
{
int ret = scanf("%d",&a[i]);
if(ret != 1) //判断输入是否有效
{
printf("输入数据有误!\n");
while(getchar() != '\n');
break;
}
}
//核心代码
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n-1-i; j++) //记录每次需要比较的次数
{
if(a[j] > a[j+1]) //两两比较,进行交换
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
for(int i = 0; i < n; i++) //输出排序好的数组
{
printf("%d ",a[i]);
}
printf("\n");
案例3:回文数
int n = 0;
printf("输入一个整数(代表你接下来要输入数据的个数):\n");
//给后续数组确定申请的内存空间大小
int ret = scanf("%d",&n);
if(ret != 1 || n <= 0)
{
printf("输入数据有误!\n");
while(getchar() != '\n');
}else{
printf("现在你可以输入%d个数据进行排序:\n",n);
}
int a[n];
for(int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
int m = 1; //先假设是回文数
for(int i = 0, j = n-1; i < n / 2 && j > n / 2; i++, j--)
{
if(a[i] == a[j])
{
m = 0; //判定不是回文数
printf("不是回文数!\n");
break;
}
}
if(m)
{
printf("是回文数!\n");
}