一、数组
-
为什么需要数组?
- 为了解决大量同类型数据的储存和使用问题
- 为了模拟现实世界
2.数组的分类
一维数组、
- 为n个变量连续分配储存空间
- 所有的变量数据类型必须相同
- 所有变量所占的字节大小必须相等
有关一维数组的操作:
初始化:
① 完全初始化:
int a[5]={1,2,3,4,5}
② 不完全初始化,未初始化的元素默认为0
int a[5]={1,2,3}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int a[5] = { 1,2,3 };
int i;
for (i = 0; i < 5; i++)
{
printf("%d ", a[i]); //结果是1 2 3 0 0
}
return 0;
}
③ 不初始化,什么都不放,编译器会给数组的每个元素放置随机数。
int a[5]
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int a[5];
int i;
for (i = 0; i < 5; i++)
{
printf("%d ", a[i]); //结果-858993460 -858993460 -858993460 -858993460 -858993460
}
return 0;
}
④.字符数组(字符串)
字符数组通常用于存储字符串。
char str[10] = "Hello"; // 创建一个大小为10的字符数组,并初始化为"Hello" |
⑤. 部分初始化
当数组大小未知,但你知道一些元素的值时,可以使用部分初始化。
int arr[] = {1, 2, 3, 4, 5}; // 创建一个大小为5的整型数组,并初始化 |
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int a[] = { 1, 2, 3, 4, 5 };
int i;
for (i = 0; i < 5; i++)
{
printf("%d ", a[i]); //结果 1 2 3 4 5
}
return 0;
}
二 .求数组的长度
sizeof(arr)/sizeof(arr[0]) 来计算数组的长度。其中“sizeof(arr)“计算了整个数组arr占据了多少内存(字节为单位),”sizeof(arr[0])“计算了数组中第一个元素所占多少字节,两者相除就是数组的长度。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(void)
{
int arr[] = { 1, 2, 3, 4, 5 };
int i = sizeof(arr) / sizeof(arr[0]);
printf("%d", i);
return 0;
}
二维数组
int a[3][4], 总共是12个元素,可以当做3行4列看,
a[0][0] | a[0][1] | a[0][2] | a[0][3] |
a[1][0] | a[1][1] | a[1][2] | a[1][3] |
a[2][0] | a[2][1] | a[2][2] | a[2][3] |
二维数组初始化:
方式1:
int a[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12}
方式2:
int a[3] [4]={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
}
二维数组的输出:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int i, j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
多维数组
不存在多维数组,因为内存是线性一维的
n维数组可以当做每个元素是n-1维数组的一维数组组成
举例:
int a[3][4][5] 可以看做是该数组中有3个元素的一维数组,只不过每个元素都是4行5列的二维数组
三 、数组传参使用数组名作为形参接收
1.形参如果是⼀维数组
数组大小可以省略不写,但是数组作为形参,后面的 [ ] 不可以省略
#include<stdio.h>
void set(int arr[], int sz) //将数组所有元素置为-1
{
for (int i = 0; i < sz; i++)
{
arr[i] = -1;
}
}
void print(int arr[], int sz)//依次打印数组所有元素
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 0,1,2,3,4,5,6,7 };
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组元素的个数
print(arr, sz);
set(arr, sz);
print(arr, sz);
}
2.形参如果是⼆维数组
行可以省略,但是列不能省略,并且每个[ ]都不能省略
比如可以写成 arr[ ][3] 或者arr[3][3]
# define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void print1(int arr[][4], int r, int c)
{
int i = 0;
for (i = 0; i < r; i++)
{
int j = 0;
for (j = 0; j < c; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };
print1(arr, 3, 4);
return 0;
}
3. 数组传参使用指针作为形参接收
形参使用指针接收之后,得到的是一个数组首元素的地址
得到数组首元素地址之后,就可以对数组任意元素进行操作
# define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void print2(int(*p)[4], int r, int c)
{
int i = 0;
for (i = 0; i < r; i++)
{
int j = 0;
for (j = 0; j < c; j++)
{
printf("%d ", *(*(p + i) + j));
//printf("%d ", p[i][j]); 也可以这样写
}
printf("\n");
}
}
int main()
{
int arr[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };
print2(arr, 3, 4);
return 0;
}