C语言将变量值作为新变量,在C语言中更改变量的值时,是创建新的原语还是当前原语被突变?...

我知道“可变”和“不可变”是应该用来描述对象改变诸如Java和Objective

C之类的面向对象语言中的值的能力的术语。但是,我想提出它,因为它与我的语言有关有关原始数据的问题。我知道,当我更改持有不可变对象的变量的值时,实际上是在创建一个新对象。但是,我想知道C中的基本数据的行为是否类似于不可变对象。我的意思是,当我更改保存原始数据的变量的值时,将创建新数据并由该变量引用。还是现有的原语实际上改变/修改了存储的数据值?

编辑#1:

问题#1: 我想消除一些误解(无论是我本人还是其他人),因为当我说“当我更改持有不可变对象的变量的值时,我实际上是在创建一个新对象。”

当我这么说时,我并不是要将变量分配给现有对象。例如:

// Example 1: I did not mean this

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

String x = "Hello World";

String y = x;

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

// Example 2: What I meant is this

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

String x = "Hello World";

//This will print out "Hello World"

System.out.println(x);

x = "Goodbye World";

//This will print out "Goodbye World"

System.out.println(x);

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

当然,就像示例1中那样,将变量y分配给变量x,这就是你们提出的情况,只将变量y引用给x所引用的对象。当然,在这种情况下,没有新对象。只是同一对象“

Hello World”被两个变量引用。

我的意思是,在示例2中,当x =“ Goodbye World”时,变量x引用一个具有值“ Goodbye

World”的新String对象,而不是用x初始化的第一个String对象“ Hello

World”。字符串是Java中的不可变对象。更改String变量的值的唯一方法是让变量引用现有对象 或 新的String对象。如果没有现有对象(“

Goodbye World” String对象尚未在任何地方创建),则以上代码仅创建了一个新的String对象,并对其引用了x。我对吗?如果没有,请纠正我。

问题2: 我想总结一下答案,尤其是来自 Ulfalizer 的答案:

1)实际上,变量可以存在2种形式:

a)“内存地址”-对于C语言变量以及Java和Objective C有关原始类型数据的情况就是如此。例如:int x

=1。这里的变量x是一个实际的内存地址本身,它的类型为integer,并用值1初始化。

b)“参考”-对于非原始类型数据(对象),Java中的大多数变量都是这种情况。例如:String x =“ Hello

World”。变量x只是指向“存在于某处的内存地址”的指针/引用,其内容为“ Hello World”值。

2)C,Java和目标C中的原始类型数据的变量充当“内存地址”。因此,当我这样做时:

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

int x = 10;

x = 2;

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

x变量的值(又名-内存地址)实际上从10更改为2。换句话说,可以修改/更改存储在“ Memory Address”变量中的值。

3)在C语言中,如果变量以’‘-指针类型声明,则它也可以充当引用。我将使用Ulfalizer* 的示例:int *

ptr。ptr是一个指针变量,可以指向另一个变量(即内存地址),例如:ptr =&x。如果x初始化为:int x =

10,则x是保存值为10的实际内存地址。因此在下面的代码中

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

int x;

int *ptr;

ptr = &x;

*ptr = 1;

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

我实际上可以通过ptr指针变量修改存储在x变量(又名-内存地址)中的值。

请确认我的解释是否正确/错误。谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值