【问题标题】:Initializing pointers, difference between c and c++ compilers (gcc-4.3.4)初始化指针,c和c++编译器的区别(gcc-4.3.4)
【发布时间】:2011-11-26 21:34:35
【问题描述】:

为了更好地理解指针,我编写了以下代码:

int *a = 17;

printf("%d", a+3);

使用 gcc-4.3.4 在 c 下编译良好:http://ideone.com/abotd

但是用 c++ 编译失败:http://ideone.com/IdGHy

我想知道为什么。

另外,从第一个链接可以看出,输出是 29。我伪理解发生了什么:sizeof(int) 是 4,当我写 a+3 而不是将 3 加到 17 时,3*4正在添加中。

不过,如果有人能更雄辩地解释一下,我将不胜感激。

谢谢!

【问题讨论】:

    标签: c++ c pointers gcc


    【解决方案1】:

    对于 C++ 版本,试试这个:

    int *a = (int *)17;
    printf("%d", a + 3);
    

    是的,你的解释是正确的......

    这称为指针算术,按您所说的方式工作。但是请注意,您在此处使用的代码将常量值分配给指向int 的指针在现实生活中很少使用。指针值通常来自某种内存分配函数,例如 C 中的 malloc 或 C++ 中的 new(尽管 new 不是函数)。

    【讨论】:

    • 这接近我寻求的答案。我不确定我理解的是如何将它视为指针算术的指针和导出“17”值的 int。
    • 这是 C/C++ 语言的特性之一。是的,17 是 int 文字,但在 C 中,编译器会自动将其转换为 int *,而在 C++ 中,您必须手动转换它。我希望这就是您要问的。
    • 我认为您并不真正理解“取消引用”的含义......取消引用意味着当您获取存储在指针指向的位置的值时,例如int b = *a 假设 aint * 类型,那么 *a 就是我们所说的取消引用。所以我认为你的理解是正确的,除了你称之为“casting, dereferencing. So Step 1 is: The compiler sees a`的部分是int *并理解它应该自己投射它(在c ++中我必须自己做) - 所以这就是如何我得到了“17”部分。
    • "dereference-ing" 意思是获取一个指针并查看它指向的实际值,对吧? a 是一个指向 int 的指针,对吧?我们得到了它指向的值是17,对吧?那你为什么说它是强制转换而不是取消引用?另外,当你说编译器自己转换了int * 类型的a 时,它把它转换成什么?
    • 17 只是内存中的一个位置。当您说int *a = 17 时,这意味着您只想拥有一个称为a 的指针,指向位于内存中位置“17”的int。你不知道那个位置有什么。可能什么都没有……可能是操作系统正在使用的东西(很可能)。但实际上, 17 是 int 文字,因此 C++ 抱怨您正在尝试将 int 转换为 int * 但 C 对此很好,因为它知道您正在尝试指向内存中的位置 17 .明白了吗?
    【解决方案2】:

    这不是正确的 C++ 代码。

    int * a = 17;
    

    这是无效的。您不能将 int 隐式转换为指针。你可以施放它,但如果我是你,我不会这样做。

    【讨论】:

    • 投射它:int *a = (int*)17。只是不要尝试修改a,否则您的应用程序将崩溃。
    【解决方案3】:

    你想要这样的东西:

    int foo = 17;
    int* a = &foo;
    printf("%d\n", (*a) + 3);
    

    您发布的代码尝试将指针设置为17 的地址,这可能不是有效地址,即使您需要从int 转换为指针(@987654324 @)。然后添加到该地址,并输出比它高三个 int 大小的地址。我真的不认为那是你想要的。

    【讨论】:

      猜你喜欢
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      相关资源
      最近更新 更多