您的位置:首页 > 编程语言 > C语言/C++

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

2015-06-01 18:05 232 查看

一.符号表:

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

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.引用类型

引用类型在系统中不会像指针类型一样分配新的内存空间,在符号表上引用类型仅仅是引用对象的一个别名;可以将他们理解成一个不可分割的整体。所有对引用的操作都会反映到引用对象上。
所以引用在定义时就要被初始化,并且从一而终不可变,并且不可以为空。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++