现在有一个需求:先输入一个整数n
,再输入以空格分隔的n
个整数,然后求出这n
个整数中最大的数。
例如:
输入:
10
8 6 4 1 2 5 7 9 3 0
输出:
9
为了装这n
个数,我们可以定义一个稍微大一点的数组,例如int arr[20]
。
int n;
int arr[20];
待用户输入n
后,循环n
次,读取用户输入的n
个数。
// 输入n的值
scanf("%d", &n);
// 循环n次,输入n个数据
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
声明一个变量max
,暂时认为第一个元素为最大的,把max
赋值为arr[0]
。接着,让max
与数组中的前n
个元素依次比较,把较大的放入max
中。这样,就找到了输入的n
个数据中最大的数。
// 暂时认为第一个元素为最大的
int max = arr[0];
// max与各个元素比较,把较大的放入max
for (int i = 0; i < n; i++)
{
if (arr[i] > max)
max = arr[i];
}
printf("%d\n", max);
这里的特殊性在于,数据的数量n
不确定,由用户输入决定。对于不同的输入,会出现以下3种情况。
- 如果
n
小于20,那么仅使用数组arr
中的n
个元素,后续的20 - n
个元素闲置。 - 如果
n
等于20,数组arr
中所有元素均被使用到。 - 如果
n
大于20,数组arr
无法容纳多于20个元素的数据。
第一种情况会造成有空的元素闲置,而第三种情况数组无法容纳所有需要输入的数据。那么,能否待用户输入n
后,再确定数组的元素个数呢?
1. 变长数组
一般而言,在声明数组时,我们会将数组的元素个数确定下来。
在数组元素个数的方括号中填写常量或常量表达式,确定数组元素个数。下面两个数组的元素数量均为10。
int arr1[10];
int arr2[5 + 5];
或者省略方括号中数组元素的数量,但是必须要有初始化列表,并按照初始化列表中元素的数量,确定数组元素的数量。下面的数组声明中,虽然方括号中没有填元素数量,但是初始化中有10个元素。因此,数组也将有10个元素。
int arr3[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
另外,还有一种比较特别的声明数组的方法。在数组元素个数的方括号中填一个变量,这样可以创建一个变长数组。
int n;
scanf("%d", &n);
int arr[n];
printf("sizeof of arr %d\n",sizeof(arr));
当输入10时,数组arr
的大小为10 * sizeof(int)
,即40字节。
当输入20时,数组arr
的大小为20 * sizeof(int)
,即80字节。
根据运行后的现象,数组的大小确实根据输入来确定的。但是,请注意,变长数组已经从C语言标准中移除了。编译器不一定会支持变长数组的特性。也就是说,这段代码可能在你的编译器中无法通过编译。