数组
数组的概念
概念:数组是一组相同类型元素的集合(数组中的数据必须是相同类型的)
一维数组的创建和初始化
数组的创建
数据存放的类型 数组名字[常量值];
[]中存放的是数组元素的个数,并且所有的元素类型是相同的
比如:想在一个数组中存放10个整数
int arr[10]
这就创建了一个int类型的数组,数组名字是arr,数组中有10个元素
而且还可以创建别的类型的数组
char ch[5]
float lf[15]
数组的初始化
数组的初始化用大括号,然后把数据放到大括号中
int arr[5]={1,2,3,4,5};
//这个是完全初始化
int arr[5]={1,2};
//不完全初始化,这个就是前两个元素中存放的是1,2其他三个存放的是0
int arr[5]={1,2,3,4,5,6,};
//这种是错误的,因为数据的数量多余元素个数
数组的类型
int arr[15] = { 0 };//int只是数组中元素的类型,而整个数组的类型应该是int [15]
由上面可以看出数组的类型应该是数据类型[元素个数]
一维数组的使用
数组的下标
要想访问元素中的数据应该用对应的下标来访问,下标是从0开始的
假如有这样一个数组:
int arr[5]={1,2,3,4,5};
数组 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
下标 | 0 | 1 | 2 | 3 | 4 |
可用[]来访问一个下标的对应元素比如[2]访问的就是3,[4]访问的就是5
[]叫做下标引用操作符
比如:
int main()
{
int arr[5] = { 1,2,3,4,5 };
printf("%d", arr[2]);
return 0;
}
数组在屏幕上的打印
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
return 0;
}
我们要是想将上面代码的10个元素都打印出来可以:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10};
int i = 0;
for (i = 0;i <= 9;i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
首先,创建了1个元素类型为int的数组,里面有10个元素,并且进行了完全初始化
又创建了1个名字为i的整形变量,然后写一个for循环,i作为整个数组的下标应该是从0开始的所以将i的初始化设为0,将整个数组的访问应该有9个这样就可以打印出来了
要是想要从键盘上接收10个数据,然后在屏幕上打印出来可以:
int main()
{
int arr[10] = {0};
int i = 0;
for (i = 0;i <= 9;i++)
{
scanf("%d", &arr[i]);
}
for (i = 0;i <= 9;i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
这样就可以打印出来了
打印出数组的地址
int main()
{
int arr[10] = {0};
int i = 0;
for (i = 0;i <= 9;i++)
{
printf("%p\n",&arr[i]);
}
return 0;
}
%p在c语言中就是专门用来打印地址的,打印出来的格式是16进制的,并且前面的0不会省略
可以看出地址的大小是按4字节逐步递增的,并且可以看出数组在内存中是连续存放的。
sizeof计算数组的大小
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d", sizeof(arr));
return 0;
}
sizeof计算的是数组的大小单位是字节,上面代码有十个元素,元素类型是int类型,一个int类型占4字节,所以上面代码整个数组总大小是40字节
也可以用sizeof计算数组中元素的个数,可以用数组的总大小除以数组元素单个元素的大小可以用以下方法:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d", sizeof(arr) / sizeof(arr[0]));
return 0;
}
已知数组总大小是40,因为一个int类型数组的元素大小是4,所以数组元素个数是10。
动态计算数组元素个数并且打印出对应元素
int main()
{
int arr[] = { 1,2,3,4,5 };
int gs = sizeof(arr) / sizeof(arr[0]);//将数组的元素个数赋值给gs
int i = 0;
for (i = 0;i < gs;i++)//下标是从0开始的,并且一定是小于元素个数的
{
printf("%d ", arr[i]);
}
return 0;
}
int main()
{
int arr[] = { 1,2,3,4,5,7,8,9 };
int gs = sizeof(arr) / sizeof(arr[0]);//将数组的元素个数赋值给gs
int i = 0;
for (i = 0;i < gs;i++)
{
printf("%d", arr[i]);
}
return 0;
}
这样想打印那些数字改变数组的初始化部分就可以了
sizeof和strlen的区别
sizeof是计算数组的大小的单位是字节,strlen是计算字符串长度的而且只能针对于字符串。
二维数组的创建
二维数组的基本结构
元素类型 数组名[常量值][常量值]//第一个括号代表的是二维数组有几行,第二号括号代表数组有几列
int arr[2][5]//数组中每个元素的类型是int,名字是arr,二维数组有2行5列
二维数组的初始化
不完全初始化
int arr[2][3]={1,2,3,};
和一维数组一样,将前三个元素分别定义为1,2,3然后其他的元素都是0
1 | 2 | 3 |
---|---|---|
0 | 0 | 0 |
int arr[3][5]={1,2,3,4,5,6,7};
1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|
6 | 7 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 |
二维数组是以行为基准向后打印的
int arr[3][5]={{1,2,3},{4,5},{6,7}};
1 | 2 | 3 | 0 | 0 |
---|---|---|---|---|
4 | 5 | 0 | 0 | 0 |
6 | 7 | 0 | 0 | 0 |
二维数组在初始化时可以用大括号的方式指定几个数在同一行比如{1,2,3}就可以让这三个数在第一行,4,5就要在第二行开始往后排了。
但是不可以把第二个大括号去了,编译器会报错。
比如这样:
int arr[3][5]={{1,2,3},4,5,{6,7}};
注意:如果用小括号,会被当成逗号表达式
int arr[3][5]={(1,2),(3,4)};
2 | 4 | 0 | 0 | 0 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 |
只会打印2和4
完全初始化
int arr[2][3]={1,2,3, 4,5,6};
1 | 2 | 3 |
---|---|---|
4 | 5 | 6 |
将第一行的元素定义为1,2,3第二行的元素定义为4,5,6。
二维数组初始化可以省略行,不可以省略列
int arr[][3]={1,2,3,4,5,6,7,8,9,10};
1 | 2 | 3 |
---|---|---|
4 | 5 | 6 |
7 | 8 | 9 |
10 | 0 | 0 |
二维数组的使用
二维数组的下标
二维数组的行是从0开始的,列也是从0开始的。
int arr[3][5]={1,2,3,4,5, 6,7,8,9,10, 11,12,13,14,15};
下标0 | 下标1 | 下标2 | 下标3 | 下标4 | |
---|---|---|---|---|---|
下标0 | 1 | 2 | 3 | 4 | 5 |
下标1 | 6 | 7 | 8 | 9 | 10 |
下标2 | 11 | 12 | 13 | 14 | 15 |
如果要在屏幕上打印8,它对应的下标是1行2列那么就可以写一段代码来求这个数
int arr[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
printf("%d",arr[1][2]);
二维数组的输入和输出
int main()
{
int arr[2][3] = { 0 };
int i = 0;
int j = 0;
//输入数组里各个元素的值
for (i = 0;i <= 1;i++)//假设i为行,行的下标是从0开始,到1结束
{
for (j = 0;j <= 2;j++)//假设j为列,下标从0开始,到2结束
{
scanf("%d", &arr[i][j]);
}
}
//输出各个元素的值
for (i = 0;i <= 1;i++)
{
for (j = 0;j <= 2;j++)//下标从0行开始访问,依次访问0行0列,0行1列,0行2列,访问结束后换行
{
printf("%d",arr[i][j]);//打印对应下标元素的值k
}
printf("\n");
}
return 0;
}
;
int i = 0;
int j = 0;
//输入数组里各个元素的值
for (i = 0;i <= 1;i++)//假设i为行,行的下标是从0开始,到1结束
{
for (j = 0;j <= 2;j++)//假设j为列,下标从0开始,到2结束
{
scanf(“%d”, &arr[i][j]);
}
}
//输出各个元素的值
for (i = 0;i <= 1;i++)
{
for (j = 0;j <= 2;j++)//下标从0行开始访问,依次访问0行0列,0行1列,0行2列,访问结束后换行
{
printf(“%d”,arr[i][j]);//打印对应下标元素的值k
}
printf(“\n”);
}
return 0;
}