先来看一段代码
#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则是一个数组。