一个C++程序分析,求大神教做啊!!

#include<iostream.h>

void main()
{
char *p[]={"comm","digi","auto","tele","elec"};
char **q[]={p+2,p, p+4,p+1,p+3};

cout<<q[3][1]<<endl;
cout<<*q[1]<<endl;
cout<<**(q+4)<<endl;
cout<<*(*(q+1)+1)<<endl;
cout<<*(q[3]+3)<<endl;
}

结果是:

auto
comm
tele
digi
elec
不知道q[3][1]是什么意思,为什么就指代auto了;剩下的也一样都不懂,请详细解释下,谢谢!!!

#include<iostream.h>

 void main()
 {
char *p[]={"comm","digi","auto","tele","elec"};
char **q[]={p+2,p, p+4, p+1, p+3};

for (int i=0; i<5; i++)
{
cout<<&p[i]<<":"<<p[i]<<endl;
}

cout<<"The address of q"<<endl;
for (int j=0; j<5; j++)
{
cout<<q[j]<<":"<<*q[j]<<endl;
}

cout<<q[3][1]<<endl; //<=>cout<<*(*(q+3)+1)<<endl;
cout<<*q[1]<<endl; //<=>cout<<**(q+1)<<endl;
cout<<**(q+4)<<endl; //<=>cout<<*q[4]<<endl;
cout<<*(*(q+1)+1)<<endl; //<=>cout<<q[1][1]<<endl;
cout<<*(q[3]+3)<<endl; //<=>cout<<*(*(q+3)+3)<<endl;
 }

首先,将程序的地址打印出来对比一下。数组和指针之间的对应关系,在程序中已经标出。

其次,内存模型如下图

为什么q[3][1]指向auto呢?

q[3][1]等价于 *(*(q+3)+1), q[3] = *(q+3)表示指向q[3]的内容,而指向q[3]的内容是p[1],在再&p[1]的基础上加1,就相当于得到了 &p[2],故指向了auto。

注意:q+3,应为q是指针类型,在32为机器上占4个字节,所以q+3,相当于在q的实际地址上加了12(3x4)。

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-11-05
char *p[]={"comm","digi","auto","tele","elec"};

p[0]----->"comm"

p[1]----->"digi"
p[2]----->"auto"
p[3]----->"tele"
p[4]----->"elec"

char **q[]={p+2,p, p+4,p+1,p+3};

q[0]----->p[2]----->"auto"
q[1]----->p[0]----->"comm"
q[2]----->p[4]----->"elec"
q[3]----->p[1]----->"digi"
q[4]----->p[3]----->"tele"

(1)p是一个数组名,所以p+1,p+2都表示对应p数组元素的地址。(*(p+1)可以写p[1])
而p数组元素的值(即p[1])为字符串地址。
(对p数组元素解析,也就取p数组元素的值,如p[2],得到字符串"auto"的地址)

(2)q也是一个数组名,q+1,q+2表示对应q数组元素的地址。(*(q+1)可以写q[1])
而q数组元素的值(即q[1])为p+数字(p数组元素的地址)

所以
q[3][1]
//q[3]的值为p+1,也就是p[1](数组元素)的地址 。

然后[1],就是对 p[1]的地址 加1,然后解析。
也就是p+1+1=p+2,然后解析,得到p[2],也就是"auto"字符串的地址

其他同理。
*q[1] //第一:q[1]的值为p,第二:对p解析,即p[0](或*p)。即"comm"
**(q+4)//可以写成*q[4],同上,得到p[3],即"tele"
*(*(q+1)+1)//可以写成*(q[1]+1),即*(p+1),即p[1],即"digi"
*(q[3]+3)//可以写成*(p+1+3)=*(p+4)=p[4],即"elec"
相似回答