C语言重新赋值内存地址会变吗?
inta=1,假设内存地址为0X01a=2,重新赋值后是重新开一个内存空间0X02存放2,还是直接修改0X01的内容?...
int a = 1 ,假设内存地址为0X01
a= 2 , 重新赋值后是重新开一个内存空间0X02存放2,还是直接修改0X01的内容? 展开
a= 2 , 重新赋值后是重新开一个内存空间0X02存放2,还是直接修改0X01的内容? 展开
2021-08-13 · 学动漫、设计、电竞、电商、短视频、软件等
关注
展开全部
变量a的地址是不能变的,当程序被加载时,操作系统会为它分配好地址,且一经分配,不能再改变!当然,每一次程序运行时,操作系统为a分配的地址可以不同。
有以下几点常常另初学者感到困惑,现举例加以解释:
int b,c,*a;
a=&b;
语句a=&b;并没有改变a的地址,它只是改变了a这个箱子中装的东西。如果你在语句a=&b;的前后用printf("%d",(int)&a);输出a的地址,就会发现它们是一样的。如果后面再来个a=&c;则printf("%d",(int)&a);的输出也一样!
关键是要区分以下几点:
a,表示a的值,即它装的东西,具体到这个例子,a装的是另一个int型变量的地址。如果a不是const类型的,则它装的东西可以改变。比如,这里先装的是b的地址(指针变量是用来装地址的),后改成了c的。
&a,当然就表示a自己的地址了,你可以将a想象成一个箱子,它的地址就是这个箱子的编号。
*a,因为a是一个指针,*a就表示a指向的变量的值,即b或c的值(具体要看a装的是谁的地址,即a指向谁),也即*a=b或*a=c。
现假设a装的是b的地址,那有:
a=&b,即a的值等于b的地址。
*a=b=*(&b),这里*的作用是取出某个地址中的值。因为a的值是b的地址,因此*a取出的是b的值,同理(&b)是b的地址,*(&b)取出的也是b的值!
分析一下a,b,c的内存模型(即它们在内存中是怎样表示的、关系又是怎样的),理解这些就不难了,你边学边体会吧!
有以下几点常常另初学者感到困惑,现举例加以解释:
int b,c,*a;
a=&b;
语句a=&b;并没有改变a的地址,它只是改变了a这个箱子中装的东西。如果你在语句a=&b;的前后用printf("%d",(int)&a);输出a的地址,就会发现它们是一样的。如果后面再来个a=&c;则printf("%d",(int)&a);的输出也一样!
关键是要区分以下几点:
a,表示a的值,即它装的东西,具体到这个例子,a装的是另一个int型变量的地址。如果a不是const类型的,则它装的东西可以改变。比如,这里先装的是b的地址(指针变量是用来装地址的),后改成了c的。
&a,当然就表示a自己的地址了,你可以将a想象成一个箱子,它的地址就是这个箱子的编号。
*a,因为a是一个指针,*a就表示a指向的变量的值,即b或c的值(具体要看a装的是谁的地址,即a指向谁),也即*a=b或*a=c。
现假设a装的是b的地址,那有:
a=&b,即a的值等于b的地址。
*a=b=*(&b),这里*的作用是取出某个地址中的值。因为a的值是b的地址,因此*a取出的是b的值,同理(&b)是b的地址,*(&b)取出的也是b的值!
分析一下a,b,c的内存模型(即它们在内存中是怎样表示的、关系又是怎样的),理解这些就不难了,你边学边体会吧!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询