- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
三级指针
三级指针:
#includestdio.h
char *c[ ] = { ENTER , NEW , POINT , FIRST};
char **cp[ ] = { c+3 , c+2 , c+1 , c };
char ***cpp = cp;
main ( )
{
printf ( %s# , **++cpp );
printf ( %s# , *--*++cpp);
printf ( %s# , *cpp[-2]+3);
printf ( %s# , cpp[ -1] [ -1] + 1 );
}
char *c[ ] = { ENTER , NEW , POINT , FIRST };
这个肯定能理解,就是定义几个字符串,然后将其放入一个数组中,因为数组内放的是字符串,所以数组类型必须为char*我们在定义一个字符的时候,经常是这么写char* str = hello world;
那么我们要定义多个字符串的时候,就可以利用数组了,像上边那样。char **cp[ ] = { c+3 , c+2 , c+1 , c };
这是二重指针。因为前边定义的c是数组类型,也就是一种常量指针(地址),所以c+3,c+2,c+1,c都是指向数组c每个元素的地址。现在要将数组元素的地址放在数组中,那么该用什么数据类型呢?存放一个变量(也可以是字符串)地址时,需要的是指针,那么存放一个地址的地址,就需要一个二重指针(因为只有指针可以存放地址,这里是存放一个地址的地址,所以要用二重指针)。char ***cpp = cp;
cp本来就是一个常量指针,再加上他的类型是char**,所以它就是一个三级指针。这里cpp的类型是char***,也是三级指针,所以将cp直接赋值给cpp也就没有问题啦(类型相同的嘛(都是三级指针))。
rintf ( %s# , **++cpp );
++的优先级高,所以先执行++cpp,也就是得到数组cp的第二个元素地址。
两个**我们分开看,先看*++cpp,这是取得数组cp第二个元素的值c+2。…..)
在看**++cpp,相当于*(c + 2),所以这里得到的是数组c第三个元素的地址,也就是POINT字符串的地址,所以这里输出POINT#rintf ( %s# , *--*++cpp );
由优先级和执行顺序的关系得知,这里会先执行++cpp,因为前一个输出语句已经导致cpp加1了,所以现在cpp再加1,那么会得到数组cp的第三个元素地址。再执行*++cpp,这取得数组cp第三个元素的值c+1。
然后再执行--*++cpp,相当于--(c+1),也就是c,然后再执行*c,所以取得是数组c的第一个元素的地址,所以输出结果为ENTER#rintf ( %s# , *cpp[-2] + 3 );
数组下标优先,所以会先执行cpp[-2],也就是*(cpp-2);因为前两输出语句导致cpp加了2,所以现在-2后,又使cpp-2的地址为数组cp的首地址,所以得到数组cp第一个元素c+3。再执行*(cpp[-2]),也就是*(c+3),这就得到了数组c的第四个元素的地址,也就是字符串FIRST的地址,然后这个地址再加3,所以得到字符串ST的地址,因此输出结果为ST#rintf ( %s# , cpp[ -1 ] [ -1 ] + 1 );
先执行cpp[-1],相当于*(cpp-1)因为前两个输出语句导致cpp被加了2,它目前指向数组cp的第三个元素,所以cpp-1相当于数组cp第二个元素c+2,然后再执行cpp[-1][-1],相当于(c+2)[-1],也就是*(c+2-1) = *(c+1),所以得到数组c的第二个元素的地址,也就是字符串NEW的地址,然后在这个地址上加1,就得到字符串EW的地址,所以输出结果为EW#程序如下: #define ? NL ? 99 main() { ? int ? , j , k , n ; ? float ? ***data; ? ?data=(float ? ***)malloc((NL)*sizeof(float ? **)); for(i=0;i NL;i++) { ? ? ? ? ? ? ? data[i]=(float**)malloc((NL)*sizeof(float*)); printf( %d ? is ? ok!\n ,i); ? ? ? for(j=0;j NL;j++) ? ? ? ? ? ?{ ? ? ? ? ? ? ? data[i][j]=(float*)malloc((NL)*sizeof(float)); ? ? ? ? ? ?
文档评论(0)