C 语言中的好基友 数组和指针之三
2015-08-05 09:11
309 查看
经过前两章的积累准备挑战一下变态的***
代码如下
尝试解读最要命的***super[0]是个神马
char stra[256]= "abcdefg"; //strstra是一个数组,每个元素是char*类型的字符串
char* strstra[2] = { stra, "xxx"}; //super[2][2]总共有2×2=4个元素,每个元素是char**类型
char** super[2][2] = { { strstra, strstrb}, { strstrc,strstrd } }; //根据第二章节的结论,我们可以很快知道数组super 由super[0]和super[1]两个子数组组成
Step1) super[0] 是 { strstra, strstrb} 的数组名,同时也是指向这个数组的指针,指针类型是char**,也就是说super[0]指向strstra,而super[0]+1指向strstrb
既然super[0]指向strstra的指针,那么指针解引用 *super[0]就是strstra
Step2) 进一步推算**super[0]就是*strstra,我们根据第一章节结论,strstra就是指向stra的指针,所以*strstra就是stra,那么**super[0]就是stra
Step3) 根据上一步推论,***super[0]就是*stra,而stra是指向"abcdefg"的首元素的指针(指针类型是char),所以最终*stra就是字符'a',也就是***super[0] = 'a'
最后给出运行结果,可以对比下是否和自己的推论一致
代码如下
char stra[256]= "abcdefg"; char strb[256]= "opqrst"; char strc[256]= "uvw"; char strd[256]= "xyz"; char* strstra[2] = { stra, "xxx"}; char* strstrb[2] = { strb, "uuu"}; char* strstrc[2] = { strc, "www"}; char* strstrd[2] = { strd, "yyy"}; char** super[2][2] = { { strstra, strstrb}, { strstrc,strstrd } };//声明了一个二维数组,每个元素是char**类型,由super[0]和super[1]两个子数组组成 printf("1..%p \n",super); printf("1..%p \n",super[0]); printf("1..%p \n",super[1]); printf("2..%s \n",super[0]); printf("2..%s \n",*super[0]); printf("2..%s \n",**super[0]); printf("2..%c \n",***super[0]); printf("3..%s \n",(*super[0])[0]); printf("3..%s \n",(*super[0])[1]); printf("4..%s \n",*(*super[0]+1)); printf("5..%s \n",super[0][0][0]); printf("5..%c \n",super[0][0][0][0]); printf("5..%c \n",super[0][0][0][1]); printf("6..%s \n",*(*super[1]+1)); printf("6..%s \n",**(super[1]+1)); printf("6..%s \n",*(super[1]+1)); printf("7..%c \n",*(**super[0]+1)); printf("8..%c \n",*(**super[0]+2)); printf("size of super is %d \n",sizeof(super)); printf("size of super[0] is %d \n",sizeof(super[0]));
尝试解读最要命的***super[0]是个神马
char stra[256]= "abcdefg"; //strstra是一个数组,每个元素是char*类型的字符串
char* strstra[2] = { stra, "xxx"}; //super[2][2]总共有2×2=4个元素,每个元素是char**类型
char** super[2][2] = { { strstra, strstrb}, { strstrc,strstrd } }; //根据第二章节的结论,我们可以很快知道数组super 由super[0]和super[1]两个子数组组成
Step1) super[0] 是 { strstra, strstrb} 的数组名,同时也是指向这个数组的指针,指针类型是char**,也就是说super[0]指向strstra,而super[0]+1指向strstrb
既然super[0]指向strstra的指针,那么指针解引用 *super[0]就是strstra
Step2) 进一步推算**super[0]就是*strstra,我们根据第一章节结论,strstra就是指向stra的指针,所以*strstra就是stra,那么**super[0]就是stra
Step3) 根据上一步推论,***super[0]就是*stra,而stra是指向"abcdefg"的首元素的指针(指针类型是char),所以最终*stra就是字符'a',也就是***super[0] = 'a'
最后给出运行结果,可以对比下是否和自己的推论一致
1..0xbfdeb7a0 1..0xbfdeb7a0 1..0xbfdeb7a8 2..ȷ������з�и�й�к�xyz 2..к�xyz 2..abcdefg 2..a 3..abcdefg 3..xxx 4..xxx 5..abcdefg 5..a 5..b 6..www 6..xyz 6..з�и�й�к�xyz 7..b 8..c size of super is 16 size of super[0] is 8
相关文章推荐
- Android Studio系列教程五--Gradle命令详解与导入第三方包
- android view startAnimation后setVisibility没有效果
- importtsv工具使用笔记
- httpClient实现获取网络信息
- iOS 网络编程socket NSSteam的使用
- 2015年8月3日--oracle
- 在Eclipse中搭建Python开发环境
- 配置IIS7运行CGI脚本创建动态网页
- 设计模式之-----迭代器模式
- 南邮 OJ 1125 Substring
- 递归 Seeding
- 用静态工厂方法代替构造器
- 云恋社区全国人数最多的交友中心
- WPF MVVM初体验
- 南邮 OJ 1124 Hotel
- C语言中的宏
- 剑指Offer面试题25(Java版):二叉树中和为某一值的路径
- /etc/ethers
- POJ2362 Square(dfs)
- Emberjs搜索