C 语言中的好基友 数组和指针之三

本文详细解读了C++中二维数组、指针数组的使用及操作,通过实例展示了如何通过指针访问和操作多维数组元素,以及如何进行多级解引用。文章深入剖析了关键代码片段,包括如何定义、初始化以及打印二维数组及其元素的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经过前两章的积累准备挑战一下变态的***

代码如下

    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 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值