现在的位置: 首页 > 综合 > 正文

总结—c++ 指针相关总结

2013年02月10日 ⁄ 综合 ⁄ 共 719字 ⁄ 字号 评论关闭

一、取地址运算符&

这个是我自己理解,可能错误(编译器内部实现可能比这个要复杂的多,但这样理解基本可以应付复杂的语句和面试题目了):

取地址运算符返回一个零时的变量(有一个临时的符号在符号表里),所以再对这个临时变量做去内容运算(*)时,才能正确的知道到底取多长内存的数据,因为可以从符号表里获取零时变量的类型信息。

类似这个的还有强制转换也可以看成“强制转换运算符”返回的也是一个零时变量(符号),另外记住,强制转换运算符的优先级要高于算术运算符的优先级。

补充:对于复杂点的问题,要分清内容是内容,描述是描述,要独立开来分析,比如:

*(int*)&t = 100;  这句是c语义用法,等价于c++中 *reinterpret_cast<int*>(&t) = 100;  

在分析上面的语句时,&t这个算法表达式返回一个临时变量,这个临时变量加上强制转换符就成为了一个类型变量,以后对这个变量内存操作时就有描述依据了。所以分析时,内存内容就是&t,它可以是1002或1004等具体的地址值,这个内存块是纯粹的没有任何描述,但符号表里对应这个内存块的条目的符合有对这个内存快的描述。具体分析这样:&t假设为1002,这个1002就是个纯粹的内容,无论怎么强制转换内容都是1002(除非是int向double转换要内存补齐才会改变内容),而对这个1002的描述就是int*,所以经过取内容运算就返回1002地址对应的内容。

 其实对上面最直观的理解就是一个语句:

int *p=new int();

上面的语句中new运算符只是返回单纯的一块内存的起始地址,而p是在符号表里有描述的,这句话作用就是在符号表里填一个符合,并把内存快的起始地址填入符号表地址列中。

抱歉!评论已关闭.