【发布时间】:2018-03-06 23:46:39
【问题描述】:
我一直认为:
char a[10];
char* p = &a;
是错误的,应该是以下之一:
char a[10];
char* p = a; // OR
char* p = &a[0];
我希望我能在这里找到线程所以我正在阅读说 p = &a;是有效的,而且是关于 C 语言,而不是 C++。
显然我一直在想:
char* p = new char[10];
char* p1 = &p; // Is wrong
但是当一个数组被创建为堆栈空间中的一个本地数组时,我的直觉认为a、&a 和&a[0] 都是相同的值/地址似乎是合理的。我不得不说,我一直在关注 C++ 并没有看到它以这种方式完成,这就是为什么当我开始研究 C 时,我很快将其称为错误,但我确定它不在 C 中(很好验证对此也将不胜感激)。我只是想知道在 C++ 中是否也是这种情况,因为据我记得在 C++ 中通常是用其他两种方式之一完成的,而这种方式(如果我的想象力不是在玩诡计)似乎在 C 中完成。
编辑:这是一个非常愚蠢的问题。我的困惑来自于我的 Visual Studio 编译器用 C 编译它,而不是用 C++ 编译它,所以我认为这方面的语言有所不同。我不会删除这个问题,因为它已经有了答案。
【问题讨论】:
-
相同的地址,不同的类型。你的编译器应该给你一个类型不匹配的错误,因为 p 是一个指向 char 的指针,而 &a 是一个指向 10 个字符的数组的指针。
-
@immibis 哦,我明白了。我已经为 C 和 C++ 设置了 Visual Studio,我刚刚尝试过,这似乎是这两种语言之间的另一个差异。
-
考虑以下几点:
struct foo { int x; int y; }; struct foo obj; int *ptr = &obj; -
这两种语言的区别是什么意思?两者都是一样的。
-
@melpomene 在带有 GCC 的在线编译器上,它确实说类型不匹配。在我的 Visual Studio 上,严格使用 C 编译并禁用语言扩展,它编译得很好。事实上,有人在这里发布了 C 代码作为一个问题,他的算法运行良好,没有人叫他出来。奇怪的。我希望我能找到那个问题..
标签: c++ c arrays memory-address