深入理解C语言指针——挑战C指针笔试题(11)

85 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

笔试题5

int main()
{
    int a[5][5];
    int(*p)[4];
    p = a;
    printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
    return 0;
}

解析

int main()
{
    int a[5][5];
    int(*p)[4];
    //p为int [4] 类型的数组指针
    p = a;
    //a为首元素地址,第一行的地址
    //a为 int [5]数组指针
    //将 a 赋值给 p
    printf("%p,%d\n", &p[4][2] - &a[4][2],
    &p[4][2] - &a[4][2]); // fffffffc -4
    // &p[4][2] - &a[4][2] = -4 
    return 0;
}

在这里插入图片描述 在这里插入图片描述

笔试题6

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", *(ptr1 - 1), *(ptr2 - 1));
    return 0;
}

解析

int main()
{
    int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int* ptr1 = (int*)(&aa + 1);
    //&aa+1 跳过一个数组大小,数组指针
    // aa+1指向数组的末尾
    //(int*)(&aa + 1)转换成int*指针
    int* ptr2 = (int*)(*(aa + 1));
    //aa+1首元素地址 + 1 指向第二个元素地址
    // 而这里的首元素地址就是第一行地址
    // 加一后指向第二行地址
    //(int*)(*(aa + 1))转换成 int*指针
    printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));//10,5
    //ptr1-1数组末尾指针-1 ptr1是int*指针
    // 所以减一得到 最后一个元素地址 
    // 解引用后得到元素 10
    //ptr2-1第二行数组地址-1 
    // 因为prt2是int*指针类型-1 跳过一个int类型
    //*(ptr2-1)得到第一行最后一个元素 5
    return 0;
}

在这里插入图片描述

笔试题7

#include <stdio.h>
int main()
{
    char *a[] = {"work","at","alibaba"};
    char**pa = a;
    pa++;
    printf("%s\n", *pa);
    return 0;
}

解析

int main()
{
    char* a[] = { "work","at","alibaba" };
    char** pa = a;
    pa++;
    //pa++ 后指向char* "at"
    printf("%s\n", *pa); // at 
    return 0;
}

在这里插入图片描述 在这里插入图片描述

笔试题8

int main()
{
    char *c[] = {"ENTER","NEW","POINT","FIRST"};
    char**cp[] = {c+3,c+2,c+1,c};
    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);
    return 0;
}

解析

int main()
{
    char* c[] = { "ENTER","NEW","POINT","FIRST" };
    char** cp[] = { c + 3,c + 2,c + 1,c };
    char*** cpp = cp;
    printf("%s\n", **++cpp);        //POINT
    printf("%s\n", *-- * ++cpp + 3);//ER
    printf("%s\n", *cpp[-2] + 3);   //ST
    printf("%s\n", cpp[-1][-1] + 1);//EW
    return 0;
}

在这里插入图片描述

在这里插入图片描述


C语言指针完结,欢迎大佬的评论,感谢支持,点赞,收藏!