在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

我在学习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 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.

-----------------------------------------