对于理解不同,我们需要了解两种不同上下文。
- 在值上下文,
T
类型的数组的名称是相当于一个指针键入T
,并等于一个指针数组的第一个元素。
- 在对象上下文中,类型为
T
的数组的名称不会减少为指针。
什么是对象上下文?
在a = b;
,a
处于对象上下文中。当你获取一个变量的地址时,它用在对象上下文中。最后,在变量上使用sizeof
运算符时,它在对象上下文中使用。在所有其他情况下,在值上下文中使用一个变量。
现在,我们有这方面的知识,当我们这样做:
void f(int arr[4]);
这是正是相当于
void f(int *arr);
当你发现了,我们可以省略(以上4)大小来自函数声明。这意味着你无法知道传递给f()
的“数组”的大小。后来,当你这样做:
int a[]={1,2,3,4};
f(a);
在函数调用,这个名字a
是在价值方面,所以它减少的指针int
。这很好,因为f
需要一个指向int
的指针,所以函数定义和使用匹配。传递给f()
的是指向a
(&a[0]
)的第一个元素的指针。
在
int a[]={1,2,3,4};
int b[4] = a;
名称b
的情况下在一个对象上下文中使用,并且不降低到指针。 (顺便说一下,这里a
处于值上下文,并减少了一个指针。)
现在,int b[4];
分配的4个int
S吸留值得并给出了名称b
给它。 a
也被分配了类似的存储空间。所以,实际上,上述分配意味着“我想使存储位置与先前的位置相同”。这没有意义。
如果你想副本的a
内容为b
,那么你可以做:
#include <string.h>
int b[4];
memcpy(b, a, sizeof b);
或者,如果你想要一个指针b
是指向a
:
int *b = a;
这里,a
在值上下文中,并且减少到指向int
的指针,所以我们可以将a
分配给一个int *
。
最后,初始化数组时,可以分配给它明确的价值观:
int a[] = {1, 2, 3, 4};
这里,有4个元素,初始化为1,2,3和4。你也可以做:
int a[4] = {1, 2, 3, 4};
如果在列表中比阵列中元件的数量较少的元素,则这些值的其余部分被取为0:
int a[4] = {1, 2};
套a[2]
和a[3]
为0
问题的标题需要重写,当前的标题是过于通用和小写。 – 2010-01-10 04:34:47