在C中使用指针更改常量变量的值
我在学习C语言,发现我们可以通过使用指针来改变常量变量的值。 我尝试使用以下代码执行此操作:在C中使用指针更改常量变量的值,c,C,我在学习C语言,发现我们可以通过使用指针来改变常量变量的值。 我尝试使用以下代码执行此操作: Int main (void) { const int i = 10; int *ptr; *ptr = &i; printf("value before : %d",i); *ptr = 50; printf("value after : %d",i); return 0; } Output Value before : 10 Value aft
Int main (void)
{ const int i = 10;
int *ptr;
*ptr = &i;
printf("value before : %d",i);
*ptr = 50;
printf("value after : %d",i);
return 0;
}
Output
Value before : 10
Value after : 10
值没有改变
但是当我这么做的时候
Int main (void)
{ const int i = 10;
int *ptr = &i; //notice the change here
printf("value before : %d",i);
*ptr = 50;
printf("value after : %d",i);
return 0;
}
Output
Value before : 10
Value after : 50
这两种代码如何产生不同的结果 当你创建一个“指针=地址”时,当你创建指针时,你说的地址是相同的。在您的第一个程序中,u正在解引用指针,并将值设置为等于i adress,这对您的研究案例没有意义
int main (void)
{
const int i = 10;
int *ptr;
//*ptr = &i; <<< VALUE of pointer PTR is EQUAL to i ADRESS
//ptr = &i; <<< ADRESS of pointer PTR is EQUAL to i ADRESS
printf("value before : %d\n",i);
*ptr = 50;
printf("value after : %d",i);
return 0;
}
int main(无效)
{
常数i=10;
int*ptr;
//*ptr=&i;在第一段代码中,常量变量的地址从未分配给指针,因此其值从未更改
你的代码应该是
int *ptr;
ptr = &i;
让代码正常工作
const int i = 10;
int *ptr;
*ptr = &i; // this line is wrong
您在这里犯了一个与const
无关的错误。当您声明一个指针时,您会写入类型*ptr
,但星号不是指针名称的一部分。当您写入*ptr=EXPRESSION;
时,这意味着将表达式的值存储在ptr
指向的位置。但是您尚未将ptr设置为指向任何特定内容,因此程序将出现故障
要设置位置(这是您正在尝试执行的操作),您必须改为使用无星号编写ptr=EXPRESSION
:
int *ptr;
ptr = &i; // corrected
在第二个测试程序中,您有
int *ptr = &i;
它一步声明指针并设置其位置。它是上面“更正”代码的简写
这只是学习C语言时必须记住的事情之一
独立于所有这些,当你有
const int i = 10;
您可以编写代码,使其看起来像是使用非常量指针修改了i
的值,但该代码——无论其结构如何,无论指针指向i
——都是不正确的。“更好”编程语言会拒绝编译该代码。C实现几乎完全是出于历史原因,如果幸运的话,通常会编译该代码并发出警告,但您得到的程序据说有“未定义的行为”--它可能会做它看起来像做的事情,它可能会表现得好像你根本没有修改过常量变量,它可能会崩溃,它可能会让恶魔从你的鼻子里飞出来,所有这些都不被认为是错误的
(“取消引用”未设置为指向任何特定对象的指针也会生成具有未定义行为的程序。)您的代码“起作用”只是因为自动变量通常(在实现级别上)是RW。但是您收到了一些警告(除非您没有因为太烦人而将其关闭),或者(很可能)您忽略了它们(编译器试图说:伙计,我以为您知道自己在做什么-但编译代码时我停下来确认了一下。)。但如果您将变量设置为全局变量,则很可能会将其放置在RO区域,并且很可能出现SEGFAULT
const const_i = 5;
int foo(int f)
{
const int a = 3;
int *ptr = &a;
*ptr = f;
return a;
}
int main(int argc, char **argv)
{
int *ptr = &const_i;
printf("%d\n", foo(255));
*ptr = 10;
printf("%d\n", const_i);
}
这两段代码都未定义,但第一段代码有点“更多”比int*ptr;*ptr=&i;
ptr
中的最后一个未定义。您正在通过存储在ptr
中的未初始化地址将地址分配给目标整数。可能的重复我得到了它。这是一个愚蠢的错误,为ptr=&i添加了前缀*这两段代码的行为都是未定义的定义,您的答案既不能纠正也不能解释。当两位不同的代码有未定义的行为时,为什么它们会给出相同或不同的结果并不重要。因为行为会随着各种事情而改变,包括编译器选项或月亮的相位。
First Part:-
Int main (void)
{ const int i = 10;
int *ptr;
*ptr = &i;
printf("value before : %d",i);
*ptr = 50;
printf("value after : %d",i);
return 0;
}
Consider i address as 100 where value 10 is store.
Consider p address as 200 which will store the address of integer variable.
And value will be acess by *.
/* Meaning of below statement*/
*ptr = &i;
This means you are trying to store some value in this case 100(since address of i is 100) to address which is pointed by ptr which is currently invalid.
if you will try to acess *ptr this itself is invalid.(it will give u invalid *ptr = 50;read/write with valgrind).
Since there is no change in value store in i address.So it will print proper value.
------------------------------------
second case:-
int *ptr = &i; //notice the change here
Here you are storing address of i in ptr ,suppose address of i is 100.ptr will also store 100.so if you do any change it will be reflected .
------------------------------------
In place of *ptr=&i;
if you write ptr =&i;
This will reflect the value now you are storing address of i in p.
-----------------------------------------