讲讲空指针的特性和&的问题

    最近我和一些小伙伴探讨的时候,发现一个问题,可能是很基础吧,无奈自己乱搞一路,没有学精,和大家探讨一下这个问题。

    先讲讲我一开始遇到的问题吧

#include <stdio.h>
int main()
{
int *p=NULL;
scanf("%d",p);

printf("%p",p);

return 0;
}

这段代码我发现用scanf是改不动p的地址的,这样是没有输出的,因此查了资料发现,空指针指向的是系统内存老大哥,是禁止访问和读写的,因此会有这样的结果

    后来我们改进了一下代码,结果又有问题了

#include <stdio.h>
int main()
{
  int a=3;
  int *p=NULL;
  p=&a;
  scanf("%d",p);
  printf("%d",a);
  return 0;
}

先讲讲为什么p指向的地址又可以修改了,这是因为我们让p指向了变量a所在的地址,是的,虽然无法手动scanf改变p指的地址,但是可以通过改变指向的方式改变p的值。

小插曲就是:无论我们给p赋什么值,结果输出的a居然都是p的值,求助大佬后发现,原来是在scanf那里少了一个取址符,(低端的错误往往只需要半小时改错),但是我不禁有疑问就是为什么少了取址符会有这样的结果,问大佬才知道,原来是因为少了取址符,scanf的赋值是赋给那个地址所指向的内存的值。解释一下,就比如说p是指针,指向a的内存空间,那么scanf(“%d”,p)的意义是修改了p所指向的地址的值,也就是a的值。(基础没打好的痛)

后来我们加了取址符就很好了,完美符合预期。


 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值