什么衰减的数组?是否有任何与数组指针的关系?

2009-09-22 17:24:43
问题评论:

一些已知的︰ 一元加运算符可以用作"衰变运算符": 给出int a[10]; int b(void);、 然后+a是 int 的指针和+b是函数指针。如果您想要将它传递给接受引用的模板很有用。

@litb-parens 将执行相同的操作 (例如,(a) 应计算结果为指针的表达式),合适吗?。

从 C + + 14 std::decay会小于遮蔽衰减随一元的数组的方法 +。

因为这个问题是的 @JohannesSchaub-litb 标记 C 和 c + +,我希望澄清,虽然法律在 c + + 和+a +b ,它为在 C 中非法 (C11 6.5.3.3/1"一元+-运算符的操作数必须具有算术类型")

右 @lege。但我想这就是不作为一些称为一元与技巧 +。我刚才说过其实只是因为它衰减,但因为它是乐趣的原因的材料;) 玩

回答:

它说该阵列"衰减"为指针。一个 c + + 数组,该数组声明为int numbers [5]不能重新指向,即不能说numbers = 0x5a5aff23更重要的是术语衰减表示损失类型和维度;numbers衰减到int*由丢失的维度信息 (计数 5) 和类型不更加int [5]查看此处的情况下不会发生衰变.

如果通过值传递数组,什么您做的一切实际上复制指针-为该数组第一个元素的指针将被复制到该参数 (其类型应该也是一个指针数组元素的类型)。这工作由于阵列的衰减性质;一旦发生衰变, sizeof不再给出完整的数组的大小,因为它实质上成了一个指针。这就是为什么它具有首选 (还有其他原因),将传递的引用或指针。

在阵列1中传递的三种方法:

void by_value(const T* array)   // const T array[] means the same
void by_pointer(const T (*array)[U])
void by_reference(const T (&array)[U])

虽然因为数组参数已发生衰变,分配给该参数,将不会第一个将正确sizeof信息,最后两个。

1 的常数 U 应在编译时是已知。

如何是第一个通过值传递?

by_value 将指针传递到第一个元素的数组。在上下文中的函数参数, T a[]等同于T *aby_pointer 传递同样的事情,除了指针值现在为限定const如果您想要传递指针数组(而不是该数组的第一个元素的指针),则语法是T (*array)[U].

"有明确指向该数组指针"-这是不正确。如果aachar[N]的类型,然后将 decay 到char*;&a类型char(*)[N],且将衰减。

@FredOverflow︰ 所以如果U更改不需要记住在两个位置,对其进行更改或缄默的 bug 的风险...自治 !

"如果通过值传递数组,什么您做的一切实际上复制指针",就完全没有必要,因为阵列可以 ' t 值,通过传递期间。

数组基本上是作为指针在 C/c + +,但不是完全相同。一旦转换数组︰

const int a[] = { 2, 3, 5, 7, 11 };

为指针 (也不能工作而不需要转换,因此可以发生意外在某些情况下)︰

const int* p = a;

您会丢失sizeof运算符计算数组中的元素的能力︰

assert( sizeof(p) != sizeof(a) );  // sizes are not equal

这丢失的能力被称为"衰减"。

有关更多详细信息,查看此数组衰变有关文章.

数组是为指针; 基本上相同它们是完全不同的动物。在大多数环境中,数组可以是处理,就好像它是一个指针,并且指针可以处理,就好像它是一个数组,但这就是尽可能接近一些。

@John,请 pardon 我不精确的语言。试图获取与回答而陷入困境中冗长的 backstory,和"基本上...但不是完全正确"是好说明如我以往任何时候都有上大学。我敢肯定是感兴趣的人可以从 upvoted 评论得到更准确的图片。

"未转换工作"意味着相同"隐式发生了"时谈到的类型转换

@M.M︰ 编辑来阐明我原来的意图。感谢您指出冗余。

下面是标准说什么 (C99 6.3.2.1/3-其他操作数的左值、 数组和函数指示符):

当它是 sizeof 运算符或一元 & 运算符的操作数,或者是用来初始化数组的字符串文本,但表达式包含类型的类型数组转换为类型指针类型指向数组对象的初始元素而不是左值的表达式。

这意味着很多随时阵列名称,用在表达式中,它将自动转换为指向数组中第一个项的指针。

注意函数名行动中用类似的方法,但函数指针使用更低和更专业的方式它不会自动转换为指针数组名称作为几乎许多误解。

C + + 标准 (4.2 数组的指针转换) 弱化到 (强调地雷) 的转换要求︰

左值或 rvalue N T 的类型"阵列"或"未知的数组绑定的 T"可以转换为的类型"指针到 t。"rvalue

因此转换不会发生像几乎总是在 C (这允许函数重载或模板匹配的数组类型)。

这也是为什么在 C 中应避免使用数组参数在函数的原型定义 (在我看来-我不知道是否有任何一般性的协议)。它们会引起混淆并仍是虚构-使用指针参数和混乱可能不会消失,但至少参数声明不在说谎。

什么是类型的代码的行示例,其中"具有表达式的类型数组"是类型的代码的"的字符串用于初始化数组"?

+ 1 我无法理解为什么这不是向上-勾选了详细信息。它只不是准确,指出标准,立即有帮助的它甚至在大家普遍采用 C 标准一样; 经常使用"衰减"一词的长度不在所有.

@Garrett char x[] = "Hello";6 的元素的数组"Hello" does 不衰减;x获取大小6和其元素初始化的"Hello"元素的.

"衰减"指为指针类型的数组类型的隐式转换的表达式。在大多数环境中,当编译器看到数组表达式转换为"指向 T"N 元素的阵列 T"从表达式的类型并将表达式的值设置为该数组的第一个元素的地址。此规则的例外是当数组是sizeof&运算符的一个操作数或数组是被用作初始值设定项的声明中的字符串。

假定以下代码︰

char a[80];
strcpy(a, "This is a test");

表达式a是 80 元素的阵列 char"类型和表达式"这是一个测试""字符的 16 元素数组"类型 (C 中; 在 c + + 字符串文字也是 const char 数组)。但是,在调用strcpy()时,一个表达式都不是操作数的sizeof&,因此其类型隐式转换为"字符的指针",和它们的值被设置为在每个的第一个元素的地址。什么strcpy()接收不是数组,而是指针,其原型中可以看到︰

char *strcpy(char *dest, const char *src);

这不是作为数组指针相同的操作。例如︰

char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;

ptr_to_first_elementptr_to_array具有相同的;基址。但是,它们是不同的类型和处理方式不同,如下所示︰

a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]

请记住表达式a[i]将被解释为*(a+i) (该数组类型转换为指针类型才有效),以便a[i]ptr_to_first_element[i]的工作方式相同。该表达式(*ptr_to_array)[i]解释为*(*a+i)表达式*ptr_to_array[i]ptr_to_array[i]可能会导致编译器警告或错误的上下文。他们将明确做手脚如果您期待他们的计算结果为a[i].

sizeof a == sizeof *ptr_to_array == 80

再次, sizeof操作数数组时,它将不转换为指针类型。

sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
                                                  is on your platform

ptr_to_first_element是简单字符指针。

解释为表达式解释为 + 1 (*pointer_to_array)[i].

难道不"This is a test" is of type "16-element array of char" "15-element array of char"吗?(长度 14 + 1 个)

它是当数组 rots,被指向;-)

实际上,它就是如果想要传递的数组在某处,但改为传递指针 (因为那些灾难是否能通过整个数组为您),说人们差发生衰变为指针数组。

可以很好地说。一个很好的数组,它不到指针或阻止衰减的衰变是什么?您可以引用 C 部分中的示例?谢谢。

@Unheilig,当然,一个可以真空包结构并将该结构传递到一个数组。

我不知道您做什么"工作"的意思。它具有不允许访问阵列,过去虽然能如期如果您期望什么确实是发生作用。该行为 (不过,再次,正式定义) 将保留。

在许多情况下,不通过任何位置 (如下所述其他答案) 的数组也会衰减。例如, a + 1 .

内容来源于Stack Overflow What is array decaying?
请输入您的翻译

What is array decaying?

确认取消