有关C语言指针的一个问题

inta=3;constint*a_p=&a;scanf("%d",a_p);printf("%d",*a_p);----------------------------... int a=3;
const int *a_p=&a;
scanf("%d",a_p);

printf("%d",*a_p);
---------------------------------

int a=3;
const int *a_p=&a;
*a_p=4;

printf("%d",*a_p);
---------------------------------
按照我的理解 这两个程序应该都报错误啊,可是为什么第一个程序不会报错而且可以修改指针所指数据呢?蟹蟹解答。
展开
 我来答
microroom
科技发烧友

2017-12-03 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:7118
采纳率:83%
帮助的人:1392万
展开全部
第一个程序不会报错,第二个会。
scanf("%d",a_p);的确可以改变a的值(这理所当然),因为这个改变是通过scanf函数改变的,并不是通过a_p改变的啊。
追问
对对对,就是这样,但是按照我这种指针声明方式来说,它所指向的值应该不能被改变啊,我应该怎么理解这个scanf可以修改它的值啊。它们的地址都是一样的 啊
追答
假设有: int n1=1,n2=2; int *p1=&n1; const *p2=&n2;  对于一般的指针p1,可以对它进行如下的操作: 1、暴露它指向的变量的地址,如: //等同于printf("%x",&n1); printf("%x",p1); //等同于scanf("%d",&n1); scanf("%d",p1); //等同于int addressofn1=(int)&n1; int addressofn1=(int)p1;  2、读取它指向的变量的值,如: //等同于int valueofn1=n1; int valueofn1=*p1; //等同于printf("%d",n1); printf("%d",*p1);  3、修改它指向的变量的值,如: *p1=10; int t=100; *p1=t;  而对于const型指针p2(只读型指针),只能对它进行以上的1、2操作。  具体到你的问题,对于scanf("%d",a_p);你可以这样理解: 将a_p的值(a_p的值就是a的地址)传递给scanf函数(记住:这是暴露a_p指向的变量a的地址给scanf函数,而不是改变a_p指向的变量a的值),scanf函数再依据输入格式%d,从键盘缓冲区读取sizeof(int)个字节的数据到a。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式