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中的数组和指针时,人们会很快发现它们并不等同,尽管乍一看似乎是这样.我知道L值和R值的差异.不过,最近我试图找出一个可以与二维数组结合使用的指针类型,即
int foo[2][3];
int (*a)[3] = foo;
Run Code Online (Sandbox Code Playgroud)
不过,我只是不能找出编译器如何"理解"的类型定义,尽管常规运算符优先级规则*和[].相反,如果我使用typedef,问题会变得非常简单:
int foo[2][3];
typedef int my_t[3];
my_t *a = foo;
Run Code Online (Sandbox Code Playgroud)
在底线,有人可以回答我关于int (*a)[3]编译器如何读取该术语的问题吗?int a[3]很简单,int *a[3]也很简单.但那么,为什么不int *(a[3])呢?
编辑:当然,而不是"类型转换"我的意思是"typedef"(它只是一个错字).
我正在学习C,我正在尝试使用指针来反转字符串.(我知道你可以使用一个数组;这更多的是关于学习指针.)
尝试运行下面的代码时,我不断遇到分段错误.海湾合作委员会似乎不喜欢这*end = *begin;条线.这是为什么?
特别是因为我的代码几乎与另一个问题中讨论的非邪恶C函数相同
#include <stdio.h>
#include <string.h>
void my_strrev(char* begin){
char temp;
char* end;
end = begin + strlen(begin) - 1;
while(end>begin){
temp = *end;
*end = *begin;
*begin = temp;
end--;
begin++;
}
}
main(){
char *string = "foobar";
my_strrev(string);
printf("%s", string);
}
Run Code Online (Sandbox Code Playgroud) 在这个声明中:
char *a = "string1"
Run Code Online (Sandbox Code Playgroud)
究竟什么是字符串文字?是string1吗?因为这个线程C和C++中字符串文字的类型是什么?说些不同的东西.
据我所知
int main()
{
char *a = "string1"; //is a string- literals allocated memory in read-only section.
char b[] = "string2"; //is a array char where memory will be allocated in stack.
a[0] = 'X'; //Not allowed. It is an undefined Behaviour. For me, it Seg Faults.
b[0] = 'Y'; //Valid.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请添加除上述要点之外的一些细节.谢谢.
调试输出显示错误 a[0] = 'Y';
Reading symbols from /home/jay/Desktop/MI/chararr/a.out...done.
(gdb) b main
Breakpoint 1 at 0x40056c: …Run Code Online (Sandbox Code Playgroud) 可能重复:
为什么这个Seg Fault?
堆栈分配是只读的:
char* arr="abc";
arr[0]='c';
Run Code Online (Sandbox Code Playgroud)
你能改变堆栈上分配的字符串吗?