求教关于C++指针的若干问题

来源:百度知道 编辑:UC知道 时间:2024/06/09 00:00:41
程序段如下:
#include <iostream.h>
char *str[]={"gain","much","stronger","point"};
char **p[]={str+2,str,str+3,str+1};//这p有什么意义?
char ***pp=p;//p是什么呢?
void main()
{ cout<<*pp[2]<<endl;
cout<<(**pp+6)<<endl;
cout<<(*++*++pp+2)<<endl;
cout<<pp[0][-1]+1<<endl;
}
结果:point
er
ch
ain

上面p是什么值呢,p与pp的关系是怎样的,p与pp都是数组吗?
请牛人解答一下啊,这个指针的指针的指针的问题太复杂了
谢谢你的回答,辛苦了。
因为很少用这百度知道,所以不太懂规矩。
我仔细地看你的答案,可能我比较苯,没太看懂。
先说这吧:
char ***pp=p;
该元素保存p数组的数组头标号,是个char***型

cout<<*pp[2]<<endl;
pp[2]=p[2]=str+3,最后*pp[2]=*(str+3)="point"

1)pp保存p数组的数组头标号,数组头标号是啥意思,我没接触过这名称。这样pp与p的关系就搞清,我感觉pp仅仅是记录了p数组的第一个元素的地址
2)p[]应该是记录str数组(里面有4个元素,分别记录4个字符串的起始地址)中每个元素(内容为字符串首地址)在内存中的地址值,即是字符串首地址的地址,p[2]=&str[3]=str+3,*p[2]=*(str+3)="point"

虽然很麻烦还不给分..算了,我好人做到底...

char *str[]={"gain","much","stronger","point"};
str的四个元素分别保存字符串常量区的4个字符串的起始地址
该数组str总共占4*sizeof(char*)=16字节空间,每个元素内容都是char*型地址,指向那几个字符串

char **p[]={str+2,str,str+3,str+1};
p的四个元素分别保存str四个元素的地址,每个元素都是char**型

char ***pp=p;
该元素保存p数组的数组头标号,是个char***型

cout<<*pp[2]<<endl;
pp[2]=p[2]=str+3,最后*pp[2]=*(str+3)="point"

cout<<(**pp+6)<<endl;
*pp=str+2;**pp=*(str+2)=str[2]="stronger";
即**p是字符串"stronger"的首字符地址,即's'的地址
**p+6是字符'e'的地址
输出's'的地址会导致输出整个"stronger",同理输出'e'的地址会导致输出整个串"er".因为字符串输出是从一个字符地址开始输出字符,知道遇到字符'\0';

cout<<(*++*++pp+2)<<endl;
++pp=&p[1]; *++pp=p[1] ;++*++pp=++p[1]=++str=&str[1];
*++*++pp=str[1]; *++*++p+2=str[1]+2="much"+2;
和上一题同理,输出'm&#