![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
有关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);
---------------------------------
按照我的理解 这两个程序应该都报错误啊,可是为什么第一个程序不会报错而且可以修改指针所指数据呢?蟹蟹解答。 展开
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);
---------------------------------
按照我的理解 这两个程序应该都报错误啊,可是为什么第一个程序不会报错而且可以修改指针所指数据呢?蟹蟹解答。 展开
1个回答
展开全部
第一个程序不会报错,第二个会。
scanf("%d",a_p);的确可以改变a的值(这理所当然),因为这个改变是通过scanf函数改变的,并不是通过a_p改变的啊。
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。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询