之间有什么区别
int* a = 0;
和
int* a = 10;
答案 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是整数类型而不是指针。