2011-05-17 71 views
0

之间有什么区别:什么区别=指针

int x = 7; 

感谢

+1

一个会编译,另一个不会,至少不是没有警告? – 2011-05-17 15:02:51

+1

根据C标准应该是错误的警告。 – 2011-05-17 15:08:29

+0

这是你在编译器上玩的某种恶作剧吗? :D – hari 2011-05-17 17:42:23

回答

0

第一个是错误的,你应该得到一个警告 - 从最不:

int x = (int *)7; 

到你的编译器。 (int *)类型的东西不应分配给int

+0

您应该得到一个错误,而不是警告,但编译器在这方面通常是错误的。 – 2011-05-17 15:09:13

1

第一个会导致编译器错误,因为您正在分配一个指向int的指针。指针(特别是在64位的地方)并不等同于整数。

确切的答案是第一个是将一个指针的地址分配给一个int,第二个是只分配一个int。

+0

不,gcc只给我一个警告。 – sje397 2011-05-17 15:05:50

+0

这是gcc中的故意错误。 – 2011-05-17 15:09:24

1

没有实际区别,因为在第一个例子中,7被明确地转换为int *,然后隐式转换为int来匹配x的类型。然而,第一个例子是“坏代码”,因为它很混乱。

+2

它也是无效的C. C不允许从指针到整数类型的隐式转换,反之亦然。 – 2011-05-17 15:04:14

4

首先第一行无效。你不能指定一个指向int的指针(也就是说,你真的不应该这样做,它是允许的,但它没有任何意义)。

然而,所不同的是(int*)7是指“在地址7的整数”,和7只是意味着7.

+1

'*(int *)7'表示“地址7处的整数”; '(int *)7'只表示“地址7”。 – 2011-05-17 17:25:43

+0

@John Bode:是的,但它是'int *'而不是'void *'的事实意味着指针不知何故指出它指向的是什么类型。所以即使它是“地址7”,我们也知道这是一个整数。 – 2011-05-18 04:36:37

1

后者是初始化一个int变量x与值7

有效的C前者是编译时错误,许多编译器会错误地忽略。你不能指定一个指向整型变量的指针。

+0

为什么不能将一个整型变量分配给一个指针?如果我有一个整数的地址值,我想分配给一个指针。我已经在嵌入式系统中完成了这项工作,并拥有一个平坦的地址空间 – 2011-05-17 20:18:56

+0

您可以施放它,但无法直接分配。 C语言不允许在整数类型和指针类型之间直接分配。 – 2011-05-17 22:09:18

3
(int *) 

警告:幽默的回答

+1

+1这比大多数答案都好... – 2011-05-17 15:09:45

+0

哈。 +1 ......... – sje397 2011-05-17 15:10:27

0

第一个例子储存为整数,这不是类型安全的一个地址,是不是真的有效(并打破了很多的平台)。你选择了一个与数字7具有相同字节表示的地址就是偶然。你可以很容易地选择另一个地址,包括一个不适合“int”数据类型的地址。

第二个示例将整数存储在整数中,该整数是有效的。

每个可访问的内存块都有一个地址,除了与该地址关联的数字之外,指针是什么都没有。如果你想在第一个例子,以“通过地址走”正确的,它会一直是这样的:

int x = *(&7); 
(int x equals the contents of the address where the number seven is stored) 

不幸的是,上述将无法编译任,为C缺乏的取地址的概念与名称不相关的常量。

相关问题