最近我和一些小伙伴探讨的时候,发现一个问题,可能是很基础吧,无奈自己乱搞一路,没有学精,和大家探讨一下这个问题。
先讲讲我一开始遇到的问题吧
#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的值。(基础没打好的痛)
后来我们加了取址符就很好了,完美符合预期。