有什么区别
int* a = 0;
Run Code Online (Sandbox Code Playgroud)
和
int* a = 10;
Run Code Online (Sandbox Code Playgroud)
?
peo*_*oro 10
int* a将变量声明a为指向整数的指针.
=0并=10为变量赋值.
注意,这a是一个指针,它的值应该是一个地址.
地址0有一个特殊的含义:它NULL代表一个空指针.
地址10没有意义:它是一个随机的内存地址.因为它不是NULL,大多数函数会认为它是一个有效的地址,将取消引用它,因此它会给你的应用程序带来问题(未定义的行为).
其中一个应该触发警告.加快编译警告!
int *a = 0;
Run Code Online (Sandbox Code Playgroud)
这个还可以.它声明一个指针a到一个int并将其初始化为0,或NULL指针,这意味着它指向什么.尝试取消引用它会导致不好的事情,但你可以在取消引用它之前检查一个指针是否有效,所以NULL指针实际上是好事.
int *a = 10;
Run Code Online (Sandbox Code Playgroud)
这不行.它声明了与a相同的指针,int但是将其初始化为10.首先,编译器会抱怨int10不能隐式地转换为指针类型.如果忽略这一点,指针指向内存位置10,您无法保证它是有效的int或有效的,甚至属于您的进程.a解除引用会很糟糕,就像解除引用a时一样NULL,但更糟糕的是,我们没有办法检查有效性a因为10可能是好还是坏 - 我们无法知道,直到我们使用它并得到我们想要的东西/垃圾/鼻子恶魔.