数组:
什么是数组:变量的组合,是一种批量定义变量的方式。
定义:类型 数组名[数量];int arr[5];
使用:数组名[下标];下标:从零开始,范围:0~数量-1。
遍历:与for循环配合,使用循环变量i当作数组的下标。
初始化:类型 数组名[数量] = {1,2,3,4,5,...};1、数组与普通变量一样默认值是随机的,为了安全要对进行初始化。2、这种初始化语法只能在定义数组时使用,而且必须使用常量初始化。3、初始化数据过多,编译器会丢弃并产生警告。4、初始化数据不够,编译器则会补0。5、初始化数组时长度可以省略,编译器会自动统计数据的个数然后告诉数组。sizeof(arr)/sizeof(arr[0]) = 数组的长度
练习1:定义一个长度为10的数组并初始化,计算出最大值,最小值以及平均值。
#include <stdio.h>int main(int argc,const char* argv[])
{int arr[10] = {1,9,0,7,6,5,3,4,8,2};int max = arr[0] , min = arr[0];float sum = arr[0];for(int i=1; i<10; i++){if(arr[i] > max){max = arr[i];}if(arr[i] < min){min = arr[i];}sum += arr[i];}printf("%d %d %g\n",min,max,sum/10);}
练习2:定义一个长度为10的数组并初始化,进行升序排序。
for(int i=0; i<x-1; i++)
{
for(int j=i+1; j<x; j++)
{
if(i < j)
{
swap i j;
}
}
}
#include <stdio.h>int main(int argc,const char* argv[])
{int arr[10] = {1,9,0,7,6,5,3,4,8,2};for(int i=0; i<9; i++){for(int j=i+1; j<10; j++){if(arr[i] > arr[j]){int t = arr[i];arr[i] = arr[j];arr[j] = t;}}}for(int i=0; i<10; i++){printf("%d ",arr[i]);}
}
数组越界
越界:为了程序的运算效率是不会检查数组的下标。
数组越界的后果:
1、一切正常。
2、段错误
3、脏数据
练习3:定义一个长度为10的数组并初始化,找出数组中第二个大的值。
#include <stdio.h>int main(int argc,const char* argv[])
{int arr[10] = {20,19,0,7,6,5,3,4,38,2};int max = arr[0]>arr[1]?arr[0]:arr[1];int max2 = arr[0]>arr[1]?arr[1]:arr[0];for(int i=2; i<10; i++){if(arr[i] > max){max2 = max;max = arr[i];}else if(arr[i] > max2){max2 = arr[i];}}printf("%d %d\n",max,max2);
}
二维数组:
一维数组相当于把变量排成一排,通过编号访问。
二维数组相当于把变量排成矩阵,通过行号和列号访问。
定义:类型 数组名[行数][列数];int arr[3][5];[0,0][0,1][0,2][0,3][0,4][1,0][1,1][1,2][1,3][1,4][2,0][2,1][2,2][2,3][2,4]
使用:数组名[行下标][列下标]行下标:0 ~ 行数-1列下标:0 ~ 列数-1
遍历:需要与双层for循环配合,外层循环负责遍历行,内层循环负责遍历列。for(int i=0; i<3; i++){for(int j=0; j<5; j++){printf("%d ",arr[i][j]);}printf("\n");}
初始化:类型 数组名[行数][列数] = {{第一行},{第二行},{第三行}};
练习4、定义一个5*5的数组,找出其中的最小值下标,计算周的和是多少。
#include <stdio.h>int main(int argc,const char* argv[])
{int arr[5][5] = {{-1,3,5,7,9},{0,2,4,6,8},{1,2,13,4,5},{6,7,8,9,0},{4,5,6,7,8}}; int min_x = 0 , min_y = 0;for(int i=0; i<5; i++){for(int j=0; j<5; j++){if(arr[i][j] < arr[min_x][min_y]){min_x = i;min_y = j;}}}int sum = 0;min_x>0 && (sum+=arr[min_x-1][min_y]); // 上min_x<4 && (sum+=arr[min_x+1][min_y]); // 下min_y>0 && (sum+=arr[min_x][min_y-1]); // 左min_y<4 && (sum+=arr[min_x][min_y+1]); // 右min_x>0 && min_y>0 && (sum+=arr[min_x-1][min_y-1]); // 左上min_x>0 && min_y<4 && (sum+=arr[min_x-1][min_y+1]); // 右上min_x<4 && min_y>0 && (sum+=arr[min_x+1][min_y-1]); // 左下min_x<4 && min_y<4 && (sum+=arr[min_x+1][min_y+1]); // 右下printf("sum=%d\n",sum);
}
变长数组:
定义数组时使用变量当作它长度,在代码编译期间数组的度是不确定的,当执行到数组的定义语句时它的长度才家有确定下来,一旦确定就无法更改了。优点:可以根据实际情况来确定数组长度达到节约内存目的。
缺点:不可以初始化
#include <stdio.h>int main(int argc,const char* argv[])
{int n = 0;// 数组长度可以 变化printf("请输入数组的长度:");scanf("%d",&n);int arr[n] = {};printf("%d\n",sizeof(arr)/sizeof(arr[0]));
}
练习5:显示N层杨辉三角形。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
#include <stdio.h>int main(int argc,const char* argv[])
{int n = 0;printf("请输入n的值:");scanf("%d",&n);int arr[n][n];for(int l=0; l<n; l++){arr[l][0] = 1;arr[l][l] = 1;for(int c = 1; c<l; c++){arr[l][c] = arr[l-1][c]+arr[l-1][c-1];}}for(int i=0; i<n; i++){for(int j=0; j<=i; j++){printf("%d ",arr[i][j]);}printf("\n");}
}
下期:
进制转换、原反补
函数
类型限制:const static volatile register extern
指针
字符串
堆内存管理