2011-01-13 85 views

回答

10

int* a将变量a声明为指向整数的指针。

=0=10为变量赋值一些值。

请注意,a是一个指针,它的值应该是一个地址。

  • 地址0有特定的含义:它是NULL,表示指针。

  • 地址10没有意义:它是一个随机存储器地址。由于它不是NULL,因此大多数函数都会将其视为有效地址,并对其进行解引用,因此会给应用程序带来问题(未定义的行为)。

+0

int * a和int * a都相同吗? – 2011-01-13 11:29:37

+1

除非编译器给出该地址特殊含义(“视频内存缓冲区的地址”),否则定义`= 10`的行为是未定义的行为。你甚至不需要使用它。 – 2011-01-13 11:30:49

4
int* a = 0; 

将0赋给指针。

int* a = 10; 

将10指定给指针。请注意,指针(即应包含地址的变量)不是指针!

最后一个是危险的,因为它击败NULL指针检查。

1

这里我们给指针赋值,int * a = 0;意思是int a * = NULL;然而,在C++中,int * a = 10不会编译,因为“从整型到指针类型的转换需要reinterpret_cast,C型转换或函数式转换”,因为编译器认为10是整型而不是指针。

+0

这是一个很好的答案,但OP没有提到C++。 +1,如果你拿出C++特定的术语。如果没有人试图用黑暗的一面来诱惑你,C足够让人迷惑。 :P – 2011-01-13 11:30:20

5

其中一个应该会触发警告。打开你的编译器警告!

int *a = 0; 

这一个是好的。它将指针a指定为int并将其初始化为0或指针NULL,这意味着它指向任何内容。尝试对其进行解引用会导致不好的事情,但是在取消引用前可以检查指针是否有效,所以指针实际上是好东西。

int *a = 10; 

这并不好。它声明了与int相同的指针,但将其初始化为10.首先,编译器会抱怨不能将其隐式转换为指针类型。如果你忽略这一点,指针指向的内存位置10,你有不保证是一个有效的int或有效的任何东西,甚至属于你的过程。提取a会很糟糕,就像提取a的时候是NULL,但更糟的是,我们无法检查a的有效性,因为10可能很好不好 - 我们无法知道,直到我们使用它,得到我们想要的/垃圾/鼻子恶魔。

4

首先,这些不是表达式,它们是声明。

int* a = 0; 

声明一个指针到整数和具有零编译时整数常数,它被转换成一个空指针值进行初始化。换句话说,它声明了一个指向整数的空指针。

int* a = 10; 

声明一个指针到整数指向任何特定编译器定义是在由整数10表示。在绝大多数情况下的地址,有什么都没有,所以你最终未定义的行为仅仅是通过声明这个指针。

相关问题