C99 变长数组
在《 C语言的三套标准:C89、C99和C11 》一节中我们讲到,目前经常使用的C语言有三个版本,分别是 C89、C99 和 C11。C89(也称 ANSI C)是较早的版本,也是最经典的版本,国内大学几乎都是以该版本为基础进行授课。C99 和 C11 是后来对 C89 的升级,增添了一些新内容(不多),语法更加灵活了,同时兼容 C89。各种编译器都能很好地支持 C89 标准,但对 C99 的支持却不同:开源组织的 GCC 和 Xcode 使用的 LLVM/Clang 已经支持了大部分(几乎全部)的 C99 标准,而微软的 VC、VS 对 C99 却不感兴趣,直到后来的 VS2013、VS2015、VS2017 才慢慢支持,而且支持得还不好。为什么要讨论这个问题呢?因为 C89 和 C99 对数组做出了不同的规定:
在 C89 中,必须使用常量表达式指明数组长度;也就是说,数组长度中不能包含变量,不管该变量有没有初始化。
而在 C99 中,可以使用变量指明数组长度。
变量的值在编译期间并不能确定,只有等到程序运行后,根据计算结果才能知道它的值到底是什么,所以数组长度中一旦包含了变量,那么数组长度在编译期间就不能确定了,也就不能为数组分配内存了,只有等到程序运行后,得到了变量的值,确定了具体的长度,才能给数组分配内存,我们将这样的数组称为变长数组(VLA, Variable Length Array)。普通数组(固定长度的数组)是在编译期间分配内存的,而变长数组是在运行期间分配内存的。
变长数组仍然是静态数组
注意,变长数组是说数组的长度在定义之前可以改变,一旦定义了,就不能再改变了,所以变长数组的容量也是不能扩大或缩小的,它仍然是静态数组。
————————————————
版权声明:本文为CSDN博主「婉君 喜欢DIY」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42141437/article/details/112239845
————————————————
版权声明:本文为CSDN博主「婉君 喜欢DIY」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42141437/article/details/112239845
BC103 序列重组矩阵
描述
//KiKi得到了一个n行m列的矩阵,现在他想知道第x行第y列的值是多少,请你帮助他完成这个任务。
//
//输入描述:
//第一行包含两个数n和m,表示这个矩阵包含n行m列。从2到n + 1行,每行输入m个整数(范围 - 231~231 - 1),用空格分隔,共输入n*m个数,表示矩阵中的元素。接下来一行输入x和y,用空格分隔,表示KiKi想得到的元素的位置。(1≤x≤n≤10,1≤y≤m≤10)
//
//输出描述:
//一行,输出一个整数值,为KiKi想知道的值。
//示例1
//输入:
//2 3
//1 2 3
//4 5 6
//1 2
//输出:
//2
#include <stdio.h>
int main()
{int n=0;
int m=0;
scanf("%d%d",&n,&m);
int i=0;
int j=0;
int arr[n][m];//使用c99语法,变长数组,不能初始化,具体给值也行
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&arr[i][j]);
}
}
int x=0;
int y=0;
scanf("%d",&x,&y);
printf("%d ",arr[x-1][y-1]);
return 0;
}