从符号表来理解指针和引用

一.符号表:

简单说来符号表是用来储存源代码中出现的有关名字的信息,对应到本文中就是保存了变量的名称和变量在内存中分配的首地址。
1.普通类型:

如下代码:

int main(int argc, char* argv[]){ 
	int a = 5;
	char b = 'c';
	return 0;
}

对应的符号表如下图所示:




2.指针类型:

32位的系统会为指针类型的变量分配一个4字节的内存用来存储指向数据的地址。如下代码:

int main(int argc, char* argv[]){
	int a = 5;
	char b = 'c';
	int* pa = &a;
	return 0;
}

对应的符号表如下图所示:


由上图可以看出系统为int*(指针)类型分配了的内存地址为1005,符号表中pa对应的地址值也是1005。

赋值语句 int* pa = &a; 将1005对应内存块的值设置为a的地址1000,结果就是*pa的值等于内存块1000中的值即5。

3.指针的指针
指针的指针从根本上来说还是指针,如下代码所示:
int main(int argc, char* argv[]){
	int a[3] = { 1, 2, 3 };
	int *pa = a;
	int **point = &pa;
}
对应的符号表如下:



在C++中数组变量对应的也是指针类型,指向的是数组的首地址,所有在字符表中a存储的地址值为1000;然后
int *pa = a;该赋值语句执行后,系统为pa分配了内存用来存储int*,该地址是1012号,指向1000号内存块;
int **point = &pa;指针的指针在本质上也是指针,所以系统同样为point分配了1016号内存块用来存储int**指针类型,该内存块中存储的值为pa的地址即1012。
最终**point的值就等于*point(point中存储的地址值即1012号内存块)指向的内存地址(1000)中的值即1。

4.引用类型
引用类型在系统中不会像指针类型一样分配新的内存空间,在符号表上引用类型仅仅是引用对象的一个别名;可以将他们理解成一个不可分割的整体。所有对引用的操作都会反映到引用对象上。
所以引用在定义时就要被初始化,并且从一而终不可变,并且不可以为空。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值