C++中变量的声明与定义

        理论知识讲,声明和定义的区别即是否为一个变量在内存中分配空间,声明不分配内存空间,定义分配内存空间。要牢记此结论。

这其中就会出现一些混淆点: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;

 此时只要我们在任意源文件内(或和声明在同一个源文件)对变量进行定义,系统就会为其分配内存空间了:

以上是我的一些见解,望讨论。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值