C++从C继承了数组,几乎无处不在.C++提供了易于使用且不易出错的抽象(std::vector<T>自C++ 98和C++ 11std::array<T, n>以来),因此对数组的需求并不像在C中那样频繁出现.但是,当您阅读遗产时代码或与用C编写的库交互,你应该牢牢掌握数组如何工作.
本FAQ分为五个部分:
如果您觉得此常见问题解答中缺少重要内容,请写下答案并将其作为附加部分链接到此处.
在下文中,"数组"表示"C数组",而不是类模板std::array.假定了C声明符语法的基本知识.请注意,面对异常,手动使用new和delete如下所示是非常危险的,但这是另一个常见问题解答的主题.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
在C++ IS的C.1.3(2003.它也在C++ 11 IS中),该标准指出了ISO C和C++之间的差异; 即,为
char arr[100];
Run Code Online (Sandbox Code Playgroud)
sizeof(0, arr)以C语言返回sizeof(char*),但100在C++中.
我找不到sizeof两个参数的文档.明显的后备是逗号运算符,但我不这么认为:sizeof(arr)在C中100; sizeof(0, arr)是sizeof(char*).两个sizeof(0, arr)和sizeof(arr)是100在C++中.
在这种情况下,我可能会忽略IS的重点.有人可以帮忙吗?这类似于09年讨论的问题,但没有人提到IS,我认为没有给出正确的答案.
编辑:实际上,IS正在谈论逗号运算符.因此,出于某种原因,在C中(0, arr)返回a char*,但char[100]在C++中返回a .为什么?
有人可以向我解释一下
dynamic_cast<SomeObject *>( &(*similarObject) );
Run Code Online (Sandbox Code Playgroud)
做取消引用指针的地址有什么意义?指针本身不是它的地址吗?
一些源代码使用符号&(*var),其中var已经是一个指针,喜欢int *var = ....
这两个符号之间有区别吗?
是var != &(*var)吗?
示例:https://github.com/FreeFem/FreeFem-sources/blob/develop/src/medit/inout_popenbinaire.c#L40
如果我写:
int some_arr[4];
some_arr = {0, 1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
然后我的编译器(在本例中为 GCC)会抱怨我之前没有表达式{。所以我需要使用复合文字,很好:
int some_arr[4];
some_arr = (int[]){0, 1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
现在我们看到我不允许为数组赋值。
什么?
我可以用类似memcpy(some_arr, (int[]){0, 1, 2, 3}, sizeof(int[4])), 或通过some_arr逐一分配给每个元素(或通过循环)来“规避”这个问题。我无法想象 GCC 无法解析我所写的单个分配(一个不关心用户的懒惰编译器甚至可能在预处理器中完成它),所以它似乎归结为“标准说不”。那么为什么标准说这个特定的东西是禁止的呢?
我并不是在寻找标准中不允许这样做的语言,而是在寻找关于标准的这一部分是如何形成的历史教训。