【发布时间】:2015-07-27 12:47:12
【问题描述】:
在 perl 中,我可以创建一维数组,然后从它们创建二维数组,方法如下:
@a1=(a,b,c)
@a2=(d,e,f)
@a3=(g,h,i)
@m23_v1=(\@a1,\@a2,\@a3)
这是另一种方式(假设@a1、@a2 和@a3 与前面的示例相同):
@m23_v2=([@a1],[@a2],[@a3])
这两种方式的区别在于,当使用反斜杠时,更改$a[0][0] 也会更改$a1[0]。另一方面,当使用括号时,值会被复制,因此更改$a[0][0] 不会更改$a1[0]。下面是变量的内存地址,应该澄清我的意思:
print \$a1[0]
SCALAR(0x2006c0a0)
print \$m23_v1[0][0]
SCALAR(0x2006c0a0)
print \$m23_v2[0][0]
SCALAR(0x2030a7e8)
如何在 C 中实现相同的功能?我试过以下代码:
# include <stdio.h>
int main(){
int a1[3] = {1,2,3};
int a2[3] = {4,5,6};
int m23[2][3] = {a1, a2};
printf("%d\n", a1[0]);
printf("%d\n", m23[0][0]);
}
但它给了我以下编译警告:
2d.c: In function ‘main’:
2d.c:4:3: warning: initialization makes integer from pointer without a cast [enabled by default]
2d.c:4:3: warning: (near initialization for ‘m23[0][0]’) [enabled by default]
2d.c:4:3: warning: initialization makes integer from pointer without a cast [enabled by default]
2d.c:4:3: warning: (near initialization for ‘m23[0][1]’) [enabled by default]
2d.c:5:3: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
执行后C代码返回如下:
1
-1077371888
问题:
- 为什么会收到编译警告以及如何修改代码以消除它们?
- 如果给定的 C 相当于带反斜杠的 perl 版本,那么括号版本的等价物是什么(反之亦然)?
- 为什么我得到 -1077371888 而不是 1?
【问题讨论】:
-
谢谢大家。我赞成所有答案,因为每个人都提出了一些有趣的观点。我只能接受一个,所以我选择了@GrzegorzSzpetkowski,因为它很好地解释了幕后发生的事情。