您可以使用指针数组来获得等效的反斜杠版本(即@m23_v1
):
#include <stdio.h>
int main(void)
{
int a1[3] = {1,2,3};
int a2[3] = {4,5,6};
int *m23[2] = {a1, a2};
printf("%d\n", a1[0]);
printf("%d\n", m23[0][0]);
return 0;
}
在你的代码中:
int m23[2][3] = {a1, a2};
初始化器期望用整数填充。基本上,您使用两个整数创建二维数组:a1
, a2
。其余元素用零初始化。为了说明这一点,这看起来像:
int m23[2][3] = {0xaaee33, 0xaaee55, 0, 0, 0, 0};
这实际上等同于:
int m23[2][3] = {{0xaaee33, 0xaaee55, 0}, {0, 0, 0}}; // two rows, three columns
然而,a1
不是整数。它的数组名称,隐式转换为int
(转换为指针后,指向数组的第一个元素)。换句话说,您正在隐式转换地址a1
and a2
化为两个整数。事实上,这样的操作在 C 中是非法的,这样的代码甚至不应该用-pedantic-errors
标志(或同等标志)。
括号版本的等效项是什么(反之亦然)?
花括号版本的等价物是定义一个特定大小的多维数组,然后复制其中的每个元素a1
and a2
数组放入其中:
#include <stdio.h>
#include <string.h>
int main(void)
{
int a1[3] = {1,2,3};
int a2[3] = {4,5,6};
int m23[2][3];
memcpy(m23 + 0, a1, sizeof(a1));
memcpy(m23 + 1, a2, sizeof(a2));
printf("%d\n", a1[0]);
printf("%d\n", m23[0][0]);
return 0;
}