为什么循环中变量i的地址&i始终保持不变?
为什么循环中变量i的地址&i始终保持不变?
嗨,我来给你把这个事儿说透!你代码里的这个现象太正常了,完全不是bug,咱们一点点捋清楚:
首先,你在for循环的初始化部分声明了int i = 0,这个变量i的生命周期和存储位置是固定的:
- 当程序运行到这个
for循环时,系统会在栈内存里给i分配一块固定的小空间——就像你在书桌角落给它占了个专属小格子,从循环开始到结束,这个格子都不会被挪走也不会被回收。 - 循环的每一次迭代,只是把
i的值更新了(从0变成1,再变成2...),但从头到尾用的都是同一个i变量,不是每次循环都重新创建一个新的i。那你每次取它的地址,自然都是同一个位置啦!
打个生活化的比方:你每天用同一个马克杯喝水,每次倒的水不一样(对应i的值变化),但马克杯一直放在桌子的同一个地方(对应i的地址),从来没动过——是不是一下子就懂了?
再给你补个小知识点:如果你在循环体内部声明一个新变量,比如:
for(int i = 0; i<4; i++){ int temp = i; printf("temp: %d\n", temp); printf("&temp: %p\n", &temp); }
这时候你可能会发现temp的地址也大概率不变,这是因为编译器会做优化,重复利用栈上的同一块空间,但本质上temp是每次进入循环分配、退出释放的,只是实际运行时被优化了。但你的代码里的i是属于整个循环的变量,从一开始就固定了位置,所以地址肯定不会变。
总之,你完全不用疑惑,这就是C语言里局部变量(栈变量)的正常行为哦!
备注:内容来源于stack exchange,提问作者Ariel Marcelo Pardo
相关产品推荐
相关产品推荐

