C语言学习记录——삼십삼 指针数组题(3)

int main()
{
    int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int* ptr1 = (int*)(&aa + 1);
    int* ptr2 = (int*)(*(aa + 1));
    printf("%d, %d\n", *(ptr1 - 1), *(ptr2 - 1));
    return 0;
}

aa的布局是12345 678910。ptr1,取出整个数组的地址+1,也就指向了10后面。ptr2,aa是首元素地址,也就是第一行地址,+1,也就是第二行地址,解引用,就拿到了第二行,此时也就是数组名,也就是第二行第一个元素6。*(aa + 1),之前学过,其实就是aa[1]。那么两个结果就是10和5。

    const char* a[] = { "work", "at", "alibaba" };
    const char** pa = a;
    pa++;
    printf("%s\n", *pa);

指针指向字符串时,指向的是第一个字符的地址。a的布局,三个char*类型的字符串,现在char**pa指向a的首元素地址,也就是“work”的w的地址,现在pa++,跳过一个char*的字符串,所以就是“at”中的a的地址,这样以%s打印出来后就是at。

    const char* c[] = { "ENTER", "NEW", "POINT", "FIRST" };
    const char** cp[] = { c + 3, c + 2, c + 1, c };
    const char*** cpp = cp;
    printf("%s\n", **++cpp);
    printf("%s\n", *-- * ++cpp + 3);
    printf("%s\n", *cpp[-2] + 3);
    printf("%s\n", cpp[-1][-1] + 1);

把这三个字符指针全都列出来

cpp                cp                 c
char***          c+3               ENTER
                     c+2               NEW
                     c+1               POINT
                     c                   FIRST

现在cpp指向cp首元素地址,也就是c+3。c是数组名,也就是首元素地址,对应着ENTER,那么c+1——NEW,   c+2——POINT,     c+3——FIRST。现在看printf里面的内容,第一个,**++cpp,cpp指向c+3,先++,那么cpp就指向了c+2,然后*++cpp,得到的就是c+2里面的内容,c+2存储着POINT的地址,再次解引用,**++cpp,得到的就是POINT。

第二个,此时cpp已经指向c+2了。先++,指向c+1,然后解引用,得到c+1的内容,此时c+1需要--,也就变成了c,c解引用后得到其中的内容ENTER中的首元素E,+3,也就得到了ER。

第三个,cpp此时指向c+1,*cpp[-2] + 3,也就相当于*(*(cpp - 2)) + 3。cpp-2,也就变成c+3,双次解引用,得到FIRST首元素F,+3,得到ST。

第四个,也就是*(*(cpp-1)-1)+1。cpp还是c+1,-1后就变成c+2,解引用得到c+2的内容,POINT的地址,然后-1,也就指向了c+1所指向的内容NEW,再次解引用得到N,+1,最终得到EW

结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值