2011-04-10 160 views
3
int b[2], *ptr; 
b[0] = 5; 
b[1] = 7; 

ptr = &b[0]; 
*ptr++ = 66; 

printf("%d", *ptr); 

为什么我被允许做*ptr++ = 66一行,即使= 66位似乎什么都不做?当我打印*ptr它是7.任何人都可以解释为什么?编译器不应该抱怨= 66位没有效果吗?C - 为什么我允许这样做?

是不是*ptr++ = 66基本上相当于7 = 66

+0

'的ptr = &b[0];'是多余的;你可以使用'ptr = buf'来代替。 – dawg 2011-04-12 04:22:13

回答

6

发生了什么事是这样的:

  1. b[0]因为你deferencing ptr分配的66一个值,即你正在做*ptr,然后进行分配

  2. 指针本身被递增,即&b[0]++,成为&b[1]

  3. ptr现在指向b[1],这是7

换一种方式:在两个完全不同的事情进行的增量和分配。并且由于它是后缀增量,所以在其原始地址接收新值之后,指针增加

+0

我明白* ptr ++位的代码是做什么的,但为什么我可以将该表达式分配给一个数字? – Sam 2011-04-10 06:25:29

+0

@Sam:你解除引用'ptr'并将66赋值给它所对应的值,但是你正在增加指针本身。 – BoltClock 2011-04-10 06:27:02

+0

谢谢,我现在明白了。 :) – Sam 2011-04-10 06:28:38

2

您正在增加指针。之后它指向b [1]。 B [0]的值大概是66

+0

是的,我明白,但为什么编译器让我分配* ptr ++到一个数字,即使它没有效果? – Sam 2011-04-10 06:23:43

+0

检查b [0] – slezica 2011-04-10 06:24:10

+0

5的值?但编译器不会让我输入5 ++ = 7; – Sam 2011-04-10 06:26:04

1

ptr++被称为后递增,这意味着你第一使用的ptr旧值(覆盖5),然后增加ptr

+0

谢谢!所以等价的代码基本上是* ptr = 66; * PTR ++ ;?这对我有意义。 – Sam 2011-04-10 06:27:20

+0

其实这是没有道理的,那么* ptr就是67. – Sam 2011-04-10 06:27:46

+0

它相当于'* ptr = 66; PTR ++'。这意味着你增加了*指针*,而不是它指向的内容。 – Lindydancer 2011-04-10 06:35:01