gpt4 book ai didi

在 C 中使用指针更改 const 变量的值

转载 作者:行者123 更新时间:2023-11-30 20:59:41 25 4
gpt4 key购买 nike

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

这两个代码如何产生不同的结果?

最佳答案

const int i = 10;
int *ptr;
*ptr = &i; // this line is wrong

你在这里犯了一个与const无关的错误。当您声明一个指针时,您编写TYPE *ptr,但星号不是指针名称的一部分。当您编写*ptr = EXPRESSION;时,这意味着将EXPRESSION的值存储在ptr指向的位置。但是您还没有将 ptr 设置为指向任何特定的内容,因此程序将发生故障。

设置位置(这就是您想要执行的操作),您必须改为编写不带星号的 ptr = EXPRESSION:

int *ptr;
ptr = &i; // corrected

在第二个测试程序中,您改为

int *ptr = &i;

一步声明指针并设置其位置。它是上面“更正”代码的简写。

这只是学习 C 语言时必须记住的事情之一。

<小时/>

不管这一切,当你有

const int i = 10;

您可以编写看起来像的代码,它使用非常量指针修改i的值,但是该代码 - 无论它的结构如何,但是指针指向i——不正确。 “更好”的编程语言将拒绝编译该代码。 C 实现,几乎完全出于历史原因,通常会编译该代码,如果幸运的话,可能会发出警告,但您得到的程序据说具有“未定义的行为”——它可能会完全按照它看起来的样子做,它的行为可能就像你根本没有修改过常量变量一样,它可能会崩溃,它可能会让恶魔从你的 Nose 里飞出来,这些都不被认为是错误的。

(“取消引用”未设置为指向任何特定内容的指针也会产生具有未定义行为的程序。)

关于在 C 中使用指针更改 const 变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46134455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com