一维数组
一维数组的定义
先定义才能使用
数据类型 数组名[数组长度];
数据类型 数组名[] = {数组元素,…}; 数组的长度由初始化时数组元素的个数来决定
初始化数组:
int arr[5] = {1,2,3,4,5};
int arr[5] = {1,2,3,4,5,6};//警告
int arr[5] = {1,2};//补0
int arr[5] = {0};//数组元素全部初始化为0
int arr[5] = {};
int arr[] = {1,2,3,4,5};
一维数组相当于一次性定义了数组长度个变量 变量名都一样(数组名)
所以为了区分 用编号 即下标(索引)
数组下标:
数组下标是从0开始 到 数组长度-1
如果超出范围访问,则数组越界 千万注意,数组别越界访问
数组越界非常危险,编译代码时不会检查数组越界
代码可能运行没有错误,也可以有逻辑错误,也可能导致程序崩溃
数组长度:
sizeof(数组名)/sizeof(数组名[0])
C语言中数组长度一旦定义,则不能改变
可变长数组:
int n = 0;
scanf("%d",&n);
int arr[n]; //不能直接用 = {}的方式来初始化数组 = {0}
for(int i=0;i<n;i++){
arr[i] = 0;
}
通过遍历下标的方式来访问数组中的每一个元素
例题:
8 2 3 4 7 6 1 9 0
从第2个元素开始往前插入(前面是一个有序的数列,插入一个数之后使数列保持有序)插入排序
#include <stdio.h>
int main(){
int len = 0;
printf("请输入数组长度:");
scanf("%d",&len);
int arr[len];
printf("请输入%d个数组元素:",len);
int i = 0;
for(i=0;i<len;i++){
scanf("%d",&arr[i]);
}
for(i=1;i<len;i++){//把arr[i]元素插入到arr[0]-arr[i]区间 使这个区间有序
int key = arr[i];//记录arr[i]
int j=0;
for(j=i-1;j>=0 && arr[j]>key;--j){
arr[j+1] = arr[j];
}
if(j+1 != i){
arr[j+1] = key;
}
}
for(i=0;i<len;i++){
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
二维数组
矩阵 行 和 列 只是为了方便理解想像出来的矩阵 以及 行和列 但本质上不是
定义:
数据类型 数组名[二维长度][一维长度];
二维长度 相当于行
一维长度 相当于列
数据类型 是数组中存储数据元素的类型
数组中可以存储 二维长度*一维长度 个元素
下标:
行下标 下标编号从0开始
列下标 下标编号从0开始
数组名[行下标][列下标]
二维数组初始化:
数组一旦定义,就不能进行整体赋值 = {} 只能单个进行赋值
数组初始化 = {xx,...}
int arr[3][4] = {{1,2,3,4},{4,5,6,7},{7,8,9,10}};
//int arr[3][4] = {{1,2,3,4,5},{4,5,6,7},{7,8,9,10},{1,2,3,4}};//警告 多列或者多行
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13};
int arr[3][4] = {{1,2,3},{4,5}};//补0
int arr[3][4] = {{1,2}};
int arr[3][4] = {1,2,3,4,5};//补0
int arr[3][4] = {{0}};
int arr[3][4] = {0};
int arr[3][4] = {[1]={1,2,3,4}};
int arr[3][4] = {[0][0]=1,[1][1]=1,[2][2]=1};
int arr[][] = {{1,2,3,4},{4,5,6,7},{6,7,8,9}};//错误
int arr[][4] = {{1,2,3,4},{4,5,6,7},{6,7,8,9}};
int arr[][4] = {{1,2,3},{4,5},{6,7,8,9}};
int arr[][4] = {1,2,3,4,5,6,7,8,9};
可变长二维数组:
int n=0,m=0;
scanf("%d %d",&n,&m);
int arr[n][m];//不能直接初始化
例题3
输出杨辉三角形前n行
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
#include <stdio.h>
int main(){
int n = 0;
printf("行数:");
scanf("%d",&n);
int arr[n][n];
int i=0,j=0;
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
if(j==0 || i==j){
arr[i][j] = 1;
}else{
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
printf("%3d ",arr[i][j]);
}
printf("\n");
}
return 0;
}