【发布时间】:2015-12-30 20:30:33
【问题描述】:
我发现在 c 中编译与在 c++ 中编译时有一个我不完全理解的差异...假设我声明了一个大小为 5 的 char 数组:
char my_array[5];
根据我的理解,“my_array”实际上是一个字符指针,它允许我这样做:
char* a = my_array;
现在,我知道当我声明我的数组时,我只分配了 5 个字节(其中每个值一个),这意味着“&my_array”不应该存在,因为没有为指向 my_array 的指针分配内存。为了证明这一点,我这样做了:
char* b = &my_array; // compiler error in c++, not in c
char** c = &my_array; // compiler error in c++, not in c
我不明白其中的区别,为什么 c 会允许这样做?不过,假设我想将我的 char[5] 转换为 char*,不使用 a 的方法,我发现我也可以这样做:
char* c = (char*)&my_array; // works both in c and c++
那个我真的不明白。我没有确定“&my_array”不存在吗?更令人震惊的是,这两行返回的值完全相同:
// a and c have the same value (both in c and c++)
char* a = my_array;
char* c = (char*)&my_array;
接下来,假设我想在运行时执行这 5 个字节,所以我声明了一个新类型:
// pFunc is a pointer to function returning void
typedef void (*pFunc)();
然后我尝试声明一个指向函数的指针,该函数将执行我的字节数组:
pFunc pFunc1 = (pFunc)&my_array; // works, but I don't really understand why
pFunc pFunc2 = (pFunc)my_array; // compiler error in c++, not in c
突然间,不仅 &my_array 编译没有问题,而且它也是使它在 c++ 中工作的唯一方法(据我所知)。有人介意向我解释发生了什么吗?完整代码如下:
#include <stdio.h>
typedef void (*pFunc)();
int main()
{
char my_array[5];
char* a = my_array;
char* b = &my_array; // compiler error in c++, not in c
char* c = (char*)&my_array;
char** d = &my_array; // compiler error in c++, not in c
char** e = (char**)&my_array;
pFunc pFunc1 = (pFunc)&my_array; // works, but I don't really understand why
pFunc pFunc2 = (pFunc)my_array; // compiler error in c++, not in c
printf("char*:\n");
printf("0x%X\n", a);
printf("0x%X\n", b);
printf("0x%X\n", c);
printf("0x%X\n", d);
printf("0x%X\n", e);
printf("\n");
while(1);
return 1;
}
【问题讨论】:
-
""my_array" 实际上是一个字符指针" 这是不正确的
-
如果你用 Java 编译器编译 C 代码,你会得到什么?请阅读 C-tag 信息页面。 C 和 C++ 是不同的语言。对“C C++ 差异”的简单搜索将回答您的问题。并且有充分的理由将数组称为“数组”而不是“指针”(反之亦然)。
-
@Slava 好吧,这取决于上下文,因为它可以衰减为
char*,但也可以只是char[5]。 -
@cad:是的,它衰减(即自动转换为指向第一个元素的指针)。但是 is 是否与指针不同。
-
需要使用演员表应该清楚地表明你做错了什么。除非您完全了解所有含义,否则不要使用强制转换!你的编译器警告类型不匹配是有原因的。并启用警告;你的 C 编译器也应该抱怨。