初始化指针,c和c ++编译器之间的区别(gcc-4.3.4)

Los*_*_DM 0 c c++ gcc pointers

我努力更好地理解指针,我写了这段代码:

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,当我写了+ 3而不是添加3到17时,正在添加3*4 .

不过,如果有人能够更有说服力地解释它,我将不胜感激.

谢谢!

mta*_*med 5

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

int *a = (int *)17;
printf("%d", a + 3);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 17只是存储器中的一个位置.当你说'int*a = 17`时,它意味着你只想拥有一个指针,你把它称为`a`到`int`,它位于内存中的位置'17'.你不知道那个位置是什么.可能无所事事......可能是操作系统正在使用的东西(非常可能).但实际上,17是一个`int`字面值,所以C++抱怨你试图将`int`转换为`int*`但C对它很好,因为它知道你试图指向17中的位置记忆.得到它? (3认同)
  • 我认为你并不真正理解"dereference"的含义... dereference意味着当你得到存储在指针指向的位置的值时,例如`int b =*a`,假设`a`是类型` int*`,然后`*a`就是我们所说的解除引用.所以我认为你的理解是正确的,除了你称之为"cast`,dereferencing的部分.所以第1步是:编译器看到`a`是`int*`并且理解它应该自己编译它(在c ++中我必须自己做) - 这就是我得到"17"部分的方式. (2认同)