表达式之间的区别:int * a = 0; int * a = 10;

时间:2011-01-13 11:22:44

标签: c pointers

之间有什么区别
int* a = 0;

int* a = 10;

5 个答案:

答案 0 :(得分:10)

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

=0=10为变量分配了一些值。

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

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

  • 地址10没有意义:它是一个随机内存地址。由于它不是NULL,因此大多数函数会将其视为有效地址,将其取消引用,从而为您的应用程序创建问题(未定义的行为)。

答案 1 :(得分:6)

其中一个应触发警告。加快编译警告!

int *a = 0;

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

int *a = 10;

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

答案 2 :(得分:4)

int* a = 0;

将0分配给指针。

int* a = 10;

为指针指定10。注意,指针(即应该包含地址的变量)不是指针对象!

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

答案 3 :(得分:4)

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

int* a = 0;

这声明了一个指向整数的指针,并使用零编译时整数常量对其进行初始化,并将其转换为空指针值。换句话说,它声明了一个指向整数的空指针。

int* a = 10;

这声明了一个指向整数的指针,它指向你的特定编译器在整数10所代表的地址处定义的任何内容。在绝大多数情况下,那里没有任何东西,所以你最终只能得到未定义的行为声明这个指针。

答案 4 :(得分:1)

这里我们将值指向指针,int * a = 0;表示int a * = NULL;但是,在c ++中,int * a = 10不会编译,因为“从积分类型转换为指针类型需要reinterpret_cast,C样式转换或函数式转换”,因为编译器认为10是整数类型而不是指针。