参考
Anki制卡
.|NULL的原始定义是什么?
.|#define NULL ((void *)0) 是一个空指针,指向地址0。地址0是不允许访问的,不会是一个有效的地址。
.+
.|NULL和数字0是否等价?
.|否,NULL的值或许等于0,但是本身的类型是空指针,和数字类型不同
.+
.|NULL存在的意义是什么?
.|下面代码中,m2和m3的输出结果是否一致?
int main(int argc, char argv[]){
struct Person m2 = NULL;
struct Person *m3;
printf(“m2 address: %p, %d, %d \n”, m2, m2, m2==NULL);
printf(“m3 address: %p, %d, %d \n”, m3, m3, m3==NULL);
return 0;<br />}
.|输出结果为:
m2 address: (nil), 0, 1
m3 address: (nil), 0, 1
从上面可以看出,若是指针声明但未赋值,则默认值为NULL。
与赋值为NULL,效果一样。
.+
.|下面代码的输出结果是什么? 说明什么?
include
void mprint(struct Person p){
printf(“p address:%p \n”, p);
} int main(int argc, char argv[]){
mprint(0);
mprint(6);
return 0;<br />}
.|下面是具体的输出结果:
p address:(nil)
p address:0x6
.|下面的代码中,调用mprint的代码,哪个编译的会报异常?为什么?
include
void mprint(struct Person p){
printf(“p address:%p \n”, p);
} int main(int argc, char argv[]){
mprint(0);
mprint(6);
return 0;<br />}
.|mprintf(0)正常通过,mprint(6)编译报警告:
warning: passing argument 1 of ‘mprint’ makes pointer from integer without a cast [-Wint-conversion] mprint(6);
因为将0赋给函数指针p,与将NULL赋值给函数指针p,效果相同。因为NULL的定义就是(void *)0,所以编译不报警告。
而mprint(6),则会引发将int转为指针地址的警告。
