arrays - 在运行时在 C 中初始化数组
问题描述
我无法找到在运行时初始化二维数组的示例。
这是 perl 中的代码;任何人都可以将这段代码“翻译”成C吗?
my @grid; # grid = 2D array
my $gr=0; # rows in grid
my $gc=0; # cols in grid
my @ct;
if( $ARGV[0] eq '5x5' ) {
$gr=5; $gc=5; # grid is all zeroes
@ct=(2,2,2,2,0);
}
if( $ARGV[0] eq '9x9' ) {
$gr=9; $gc=9; # grid is all zeroes
@ct=(2,3,4,2,3,5,3,5,3);
}
if( $ARGV[0] eq '6x10' ) {
$gr=6; $gc=10;
@grid = (
[0,8,0,0,0,9,3,5,6,7],
[6,0,0,5,0,7,0,0,1,0],
[5,0,2,0,4,1,0,0,0,0],
[0,0,0,0,2,0,0,0,0,1],
[0,0,0,1,0,0,0,0,0,0],
[1,5,0,4,2,6,8,0,0,0],
);
@ct=(14,41,15,29,26,33,32,27,32,21);
}
解决方案
“初始化”只是为对象赋予初始值。要在运行时执行此操作,您可以执行以下任何操作,以及其他可能性:
在定义中初始化,如问题所示:
int myPoints[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };
使用单独的分配进行初始化:
myPoints[0][0] = 1;
myPoints[0][1] = 2;
myPoints[0][2] = 3;
myPoints[1][0] = 4;
myPoints[1][1] = 5;
myPoints[1][2] = 6;
myPoints[2][0] = 7;
myPoints[2][1] = 8;
myPoints[2][2] = 9;
使用计算值的代码进行初始化:
for (int i = 0; i < 3; ++i)
for (int j = 0; j < 3; ++j)
myPoints[i][j] = 3*i + j + 1;
从复合文字复制:
memcpy(myPoints, (const int [3][3]) { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} }, sizeof myPoints);
在第一种情况下(使用定义初始化),如果myPoints
是静态对象,编译器可能会将值存储在目标文件中,作为程序加载的一部分进行加载。如果myPoints
是一个自动对象,它可能会生成指令来存储数组的值。从技术上讲,C 标准允许编译器对上述任何示例执行其中任何一项。使用哪个是优化和编译器实现的问题。因此,除非性能问题很重要,否则在“运行时”初始化的区别在很大程度上是无关紧要的。
推荐阅读
- oracle - 如何将多个消费者 oracle AQ 队列加入常规队列?我究竟做错了什么?
- python - 将 Nan 转换为 0 时 nparray 出错
- flutter - Flutter 重建 Consumer 的父小部件
- python - Databricks Pyspark - Java 堆空间错误
- wpf - 击中断点时鼠标冻结/滞后
- blazor - 将 Blazor Webassembly 项目包含到现有 ASP.NET Core 项目中
- javascript - 检测触摸设备捏合程度(缩放)
- visual-studio - 打开 VS 2019 社区版
- vue.js - 为什么 Vue 无法识别 v-html 属性中使用的数据成员?
- javascript - 我正在尝试用 Javascript 制作计算器。但它不工作