理论知识讲,声明和定义的区别即是否为一个变量在内存中分配空间,声明不分配内存空间,定义分配内存空间。要牢记此结论。
这其中就会出现一些混淆点:int x 这到底是个定义还是声明呢?
为什么会有这样的疑问存在。有这么一条理论:声明就是告知编译器这个变量的的类型,即提供名称和类型信息。许多人就会误解这条理论为:只要不进行初始化,不赋值的操作就都是声明,因为他好像符合理论所讲的,只提供了名称和类型信息,这也就是混淆点出现的原因。但文章开头所提到的,利用是否分配内存空间来判断声明和定义,这一理论是永远可靠的。
#include <iostream>
int main() {
int x;
std::cout << &x << std::endl;
std::cin.get();
return 0;
}
如上图,我们未对变量x赋初值,直接打印x的地址:
x的地址已经存在(虽然是虚拟地址),这说明已经为变量分配了内存空间,此时我们可以通过地址去访问该变量了。
#include <iostream>
int main(){
int x;
std::cout << x << std::endl;
std::cin.get();
return 0;
}
我们写出如上代码并把其转为汇编:
观察第5行代码,发现此时已经是利用变量的地址来对变量进行访问,把该地址里存取的值传入到寄存器中,这也说明,此时确实已经为该变量分配了内存空间,故此举应为定义。
那么到底什么是变量的声明,查阅资料发现变量的声明前要加上关键字extern,该关键字的作用是告知编译器该变量此时只是声明状态,变量的定义可以不在此处。
#include <iostream>
int main() {
extern int x;
std::cout << "x的地址是:" << &x << std::endl;
std::cin.get();
return 0;
}
代码会报错,这也证明了此时还没有为变量分配内存空间,同时也了解到extern关键字作用在链接期。
int x = 5;
此时只要我们在任意源文件内(或和声明在同一个源文件)对变量进行定义,系统就会为其分配内存空间了:
以上是我的一些见解,望讨论。