为什么在某些动态数组声明中,我们需要将数组名称放在方括号中:
(*allocMat)[count++] = row;
答案 0 :(得分:1)
这与运算符的优先级有关,即该语句的哪一部分先执行。
就像简单的数学一样。是像x = a + b*c
或x = (a + b)*c
一样执行x = a + (b*c)
吗?
因此对于您的代码,问题是:*
比[]
“强”还是相反?
考虑一下:
*allocMat[count++] = row;
您希望如何执行?
像A:
(*allocMat)[count++] = row;
或类似B:
*(allocMat[count++]) = row;
答案是它像B一样执行,因此,如果您真的想要A,则需要显式添加括号。
当allocMat
是指向数组的指针时,您想要A的示例。
当allocMat
是一个指针数组时,您想要B的示例。
答案 1 :(得分:0)
这是因为operator precedence。数组下标运算符[]
的优先级高于一元解引用运算符*
。因此,除非使用括号,否则类似
*allocMat[count++] = row;
将被解析为
* (allocMat[count++]) = row;
这是不希望的。
要正确评估该语句,我们需要首先取消引用该指针,然后像其上那样对它建立索引
(*allocMat)[count++] = row;
在上面的代码段中,allocMat
是指向数组的指针。因此,除非取消引用的优先级较高,否则将优先考虑具有较高优先级的下标运算符[]
,这将导致错误的评估。
答案 2 :(得分:0)
Allocmat大概是指向数组的指针。
需要括号才能正确获取间接地址。因此(*allocMat)[count++]
与allocMat[0][count++]
相同。如果您省略括号,*allocMat[count++]
将等于allocMat[count++][0]
,这是完全不同的。这是因为运算符优先级-[]
的绑定比*
的绑定稍微紧密。