C++关于变量名的解析

先来看一段代码

#include <iostream>
using namespace std;

int main(){

char* str[4][5]={

{"00","01","02","03","04"},
{"10","11","12","13","14"},
{"20","21","22","23","24"},
{"30","31","32","33","34"},
};

cout<<*(str+2)<<endl;

cout<<**(str+2)<<endl;

cout<<*(*(str+2)+2)<<endl;

}

会输出什么呢?它们分别代表什么意思



要明白其中的道理,还是得先分析变量的定义,char* str[4][5]

C++解析的顺序,从右至左,有括号的优先,所以上面的定义,可以分解为

char* str[4][5] =>char* str1[5],str本质上是一个存放着4个类型为char*[5]的数组

所以*(str+n)等价于str1,而要取得某列的内容,*(str1+m),展开后就是*(*(str+n)+m),于是前面

的表达式就可以解释通了,第二个表达式,其实是*(*(str+2)+0),以上是从C++编译器的角度看这个问题,

从汇编的角度看,又是怎样的呢?

cout<<*(str+2);
0040181A   lea         eax,[ebp-28h]
0040181D   push        eax
0040181E   mov         ecx,offset std::cout (0047dea0)
00401823   call        @ILT+60(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401041)

既然C++的编译器根据规则就可以得出*(str+2)只是一个地址的结论,于是在汇编语言中,

直接把地址赋给了eax,然后作为参数传给了cout函数。

那么再来看看这个众所周知的问题char* strA[]和char (*strB)[]的区别,根据括号优先的法则,可以知道strB本质上

是一个指针,而strA则是一个数组。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值