引用局部变量
Referencing a local variable
我无法得到一件事:
当我在函数内部声明变量(局部)时,它们被分配在堆栈上。
引用是如何发生的?如果我想为局部变量赋另一个值,我是否需要知道变量在堆栈中的确切位置?这条信息是否存储在任何地方?
您不必关心变量在堆栈上的位置。在编译代码时,编译器会处理变量的存储位置和引用方式等问题。
假设您的代码如下所示:
void main() {
int a,b;
a = 5;
b = 7;
printf("%p\n", &a);
}
此代码应在堆栈上分配两个整数,'a' 和 'b'。然后它将打印出 'a' 的地址并退出。调用 main 时,堆栈将非常空。一些编译器生成的代码将在堆栈上分配一些 space,因此它看起来像这样:
- 'a': Random data
- 'b': Random data
当您说 'a = 5;' 时,您只是在告诉编译器生成一些代码 "put the number 5 in the memory location that we call 'a'"。这个内存位置 'a' 恰好在堆栈上,因此编译器将 5 放入堆栈上的那个位置。
- 'a': 5
- 'b': 随机数据
'b'几乎一样:
- 'a': 5
- 'b': 7
当我们获得对 'a' 的引用时,我们会获得堆栈上的地址,因为这是编译器决定存储 'a' 的位置。如果 'a' 是一个全局变量,地址就不会在栈上。
但是,您不需要关心。编译器应该为您处理所有这些事情。这就是 C 编译器的伟大之处,也是我们使用它们的原因。 C 编译器可以把你的任何变量放在任何它想要的地方,你不需要关心。你可以只说 "Put 5 in the spot that we call 'a'" (a = 5;) 或 "Print out the address of wherever you put 'a'" (printf("%p\n", &a);).
简而言之,函数变量是在栈上分配的。您无需知道堆栈中的位置即可设置它们,也无需关心它们的位置,因为这就是编译器的用途。
我无法得到一件事: 当我在函数内部声明变量(局部)时,它们被分配在堆栈上。 引用是如何发生的?如果我想为局部变量赋另一个值,我是否需要知道变量在堆栈中的确切位置?这条信息是否存储在任何地方?
您不必关心变量在堆栈上的位置。在编译代码时,编译器会处理变量的存储位置和引用方式等问题。
假设您的代码如下所示:
void main() {
int a,b;
a = 5;
b = 7;
printf("%p\n", &a);
}
此代码应在堆栈上分配两个整数,'a' 和 'b'。然后它将打印出 'a' 的地址并退出。调用 main 时,堆栈将非常空。一些编译器生成的代码将在堆栈上分配一些 space,因此它看起来像这样:
- 'a': Random data
- 'b': Random data
当您说 'a = 5;' 时,您只是在告诉编译器生成一些代码 "put the number 5 in the memory location that we call 'a'"。这个内存位置 'a' 恰好在堆栈上,因此编译器将 5 放入堆栈上的那个位置。
- 'a': 5
- 'b': 随机数据
'b'几乎一样:
- 'a': 5
- 'b': 7
当我们获得对 'a' 的引用时,我们会获得堆栈上的地址,因为这是编译器决定存储 'a' 的位置。如果 'a' 是一个全局变量,地址就不会在栈上。
但是,您不需要关心。编译器应该为您处理所有这些事情。这就是 C 编译器的伟大之处,也是我们使用它们的原因。 C 编译器可以把你的任何变量放在任何它想要的地方,你不需要关心。你可以只说 "Put 5 in the spot that we call 'a'" (a = 5;) 或 "Print out the address of wherever you put 'a'" (printf("%p\n", &a);).
简而言之,函数变量是在栈上分配的。您无需知道堆栈中的位置即可设置它们,也无需关心它们的位置,因为这就是编译器的用途。