正如Joel在Stack Overflow播客#34中用C编程语言(又名:K&R)所指出的那样,在C中提到了数组的这种属性:a[5] == 5[a]
乔尔说,这是因为指针运算,但我仍然不明白.为什么a[5] == 5[a]?
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的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
最近我有建议span<T>在我的代码中使用's,或者在网站上看到了一些使用span's - 应该是某种容器的答案.但是 - 我在C++标准库中找不到类似的东西.
那么这个神秘的是什么span<T>,以及为什么(或什么时候)使用它是一个好主意,如果它是非标准的?
在下面的代码中,指针值和指针地址按预期不同.
但数组值和地址不行!
怎么会这样?
产量
my_array = 0022FF00
&my_array = 0022FF00
pointer_to_array = 0022FF00
&pointer_to_array = 0022FEFC
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
int main()
{
char my_array[100] = "some cool string";
printf("my_array = %p\n", my_array);
printf("&my_array = %p\n", &my_array);
char *pointer_to_array = my_array;
printf("pointer_to_array = %p\n", pointer_to_array);
printf("&pointer_to_array = %p\n", &pointer_to_array);
printf("Press ENTER to continue...\n");
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我用C++编写代码.如果我有一些功能void foo(vector<int> test),我在程序中调用它,矢量是通过值还是引用传递的?我不确定,因为我知道向量和数组是相似的,并且类似的函数void bar(int test[])会通过引用(指针?)而不是值传递测试.我的猜测是,如果我想避免传递值,我需要明确地通过指针/引用传递向量,但我不确定.
来自Lippman的C++ Primer第5版,第182页,考虑:
int ia[3][4];
for (auto row : ia)
for (auto col : row)
Run Code Online (Sandbox Code Playgroud)
第一个
for遍历ia,其元素是大小为4的数组. 因为row它不是引用,当编译器初始化时,row它会将每个数组元素(与数组类型的任何其他对象一样)转换为指向该数组的第一个元素的指针.结果,在这个循环中的类型row是int*.
我不是很确定我理解这个自动如何工作,但如果我可以假设它自动给出一个基于ia数组成员类型的行的类型,但我不明白为什么这种for行,其中行不是引用,无效.为什么会发生这种情况?"指向该数组的第一个元素的指针",因为什么?
我在许多帖子中都看到"在大多数情况下,数组名称会衰减为指针".
我可以知道在什么情况下/数组名称表达式不会衰减成指向其第一个元素的指针吗?
灵感来自K&R第5.5节中描述的程序:
void strcpy(char *s, char *t)
{
while(*s++ = *t++);
}
Run Code Online (Sandbox Code Playgroud)
C程序
if ('\0') { printf("\'\\0\' -> true \n"); }
else { printf("\'\\0\' -> false\n"); }
if ("\0") { printf("\"\\0\" -> true \n"); }
else { printf("\"\\0\" -> false\n"); }
Run Code Online (Sandbox Code Playgroud)
版画
'\0' -> false
"\0" -> true
Run Code Online (Sandbox Code Playgroud)
为什么'\0'和"\0"评价不同的C 2
clang版本3.8.0
char** argv和之间有什么区别char* argv[]?在int main(int argc, char** argv)和int main(int argc, char* argv[])?
它们是一样的吗?特别是第一部分没有[].