• 让学指针变得更简单(三)



    前言

    指针面试题,对指针的理解不再停留在简单的知识层面上,而是可以知道面试题中指针的考察是怎样的;
    在这里插入图片描述
    在这里插入图片描述


    一、指针和数组笔试题解析

    1.1 一维数组

    首先说一下知识点:很重要!!!
    数组名的意义:

    1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
    2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
    3. 除此之外所有的数组名都表示首元素的地址。

    int a[ ] = {1,2,3,4};
    printf( “%d\n”,sizeof(a) );
    printf( “%d\n”,sizeof(a+0) );
    printf( “%d\n”,sizeof(a) );
    printf( “%d\n”,sizeof(a+1) );
    printf( “%d\n”,sizeof(a[1]) );
    printf( “%d\n”,sizeof(&a) );
    printf( “%d\n”,sizeof(
    &a) ;
    printf( “%d\n”,sizeof(&a+1) );
    printf( “%d\n”,sizeof(&a[0]) );
    printf( “%d\n”,sizeof(&a[0]+1) );

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

    1.2 字符数组

    char arr[] = {‘a’,‘b’,‘c’,‘d’,‘e’,‘f’};
    printf(“%d\n”, sizeof(arr));
    printf(“%d\n”, sizeof(arr+0));
    printf(“%d\n”, sizeof(*arr));
    printf(“%d\n”, sizeof(arr[1]));
    printf(“%d\n”, sizeof(&arr));
    printf(“%d\n”, sizeof(&arr+1));
    printf(“%d\n”, sizeof(&arr[0]+1));
    printf(“%d\n”, strlen(arr));
    printf(“%d\n”, strlen(arr+0));
    printf(“%d\n”, strlen(*arr));
    printf(“%d\n”, strlen(arr[1]));
    printf(“%d\n”, strlen(&arr));
    printf(“%d\n”, strlen(&arr+1));
    printf(“%d\n”, strlen(&arr[0]+1));

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

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

    char arr[] = “abcdef”;
    printf(“%d\n”, sizeof(arr));
    printf(“%d\n”, sizeof(arr+0));
    printf(“%d\n”, sizeof(*arr));
    printf(“%d\n”, sizeof(arr[1]));
    printf(“%d\n”, sizeof(&arr));
    printf(“%d\n”, sizeof(&arr+1));
    printf(“%d\n”, sizeof(&arr[0]+1));
    printf(“%d\n”, strlen(arr));
    printf(“%d\n”, strlen(arr+0));
    printf(“%d\n”, strlen(*arr));
    printf(“%d\n”, strlen(arr[1]));
    printf(“%d\n”, strlen(&arr));
    printf(“%d\n”, strlen(&arr+1));
    printf(“%d\n”, strlen(&arr[0]+1));

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

    char *p = “abcdef”;
    printf(“%d\n”, sizeof§);
    printf(“%d\n”, sizeof(p+1));
    printf(“%d\n”, sizeof(*p));
    printf(“%d\n”, sizeof(p[0]));
    printf(“%d\n”, sizeof(&p));
    printf(“%d\n”, sizeof(&p+1));
    printf(“%d\n”, sizeof(&p[0]+1));
    printf(“%d\n”, strlen§);
    printf(“%d\n”, strlen(p+1));
    printf(“%d\n”, strlen(*p));
    printf(“%d\n”, strlen(p[0]));
    printf(“%d\n”, strlen(&p));
    printf(“%d\n”, strlen(&p+1));
    printf(“%d\n”, strlen(&p[0]+1));

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

    在这里插入图片描述

    1.3 二维数组

    int a[3][4] = {0};
    printf( “%d\n”,sizeof(a) );
    printf( “%d\n",sizeof(a[0][0]) );
    printf( “%d\n”,sizeof(a[0]) );
    printf( ”%d\n",sizeof(a[0]+1) );
    printf( “%d\n”,sizeof(* (a[0]+1)) );
    printf( “%d\n”,sizeof(a+1) );
    printf( “%d\n”,sizeof(* ( a+1) ) );
    printf( “%d\n”,sizeof(&a[0]+1) );
    printf( “%d\n”,sizeof( * (&a[0]+1) ) );
    printf( “%d\n”,sizeof(*a) );
    printf( “%d\n”,sizeof(a[3]) );

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

    2. 指针笔试题

    int main()
    {
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&a + 1);
    printf( “%d,%d”, *(a + 1), *(ptr - 1));
    return 0;
    }
    //程序的结果是什么?

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

    //由于还没学习结构体,这里告知结构体的大小是20个字节
    struct Test
    {
    int Num;
    char *pcName;
    short sDate;
    char cha[2];
    short sBa[4];
    }*p;
    //假设p 的值为0x100000。 如下表表达式的值分别为多少?
    //已知,结构体Test类型的变量大小是20个字节
    int main()
    {
    printf(“%p\n”, p + 0x1);
    printf(“%p\n”, ( unsigned long )p + 0x1);
    printf(“%p\n”, (unsigned int * )p + 0x1);
    return 0;
    }

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

    int main()
    {
    int a[4] = { 1, 2, 3, 4 };
    int *ptr1 = (int *)(&a + 1);
    int *ptr2 = (int *)((int)a + 1);
    printf( “%x,%x”, ptr1[-1], *ptr2);
    return 0;
    }

    在这里插入图片描述

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

    #include <stdio.h>
    int main()
    {
    int a[3][2] = { (0, 1), (2, 3), (4, 5) };
    int *p;
    p = a[0];
    printf( “%d”, p[0]);
    return 0;
    }

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

    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 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;
    }

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

    #include <stdio.h>
    int main()
    {
    char *a[] = {“work”,“at”,“alibaba”};
    char**pa = a;
    pa++;
    printf(“%s\n”, *pa);
    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);
    printf(“%s\n”, * --* ++cpp+3);
    printf(“%s\n”, * cpp[-2]+3);
    printf(“%s\n”, cpp[-1][-1]+1);
    return 0;
    }

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

    总结

    指针的博客就告一段落了,敬请期待后面的博客吧!!!
    在这里插入图片描述

  • 相关阅读:
    uniapp-video自定义视频封面
    bash简化if-else
    java导出word表格 行列合并
    uniapp实现全局悬浮框
    【云原生与5G】微服务加持5G核心网
    SpringSecurity系列——授权与认证概述,安全架构day2-2(源于官网5.7.2版本)
    【Rust日报】2022-06-25 世界上最大的软件项目的内存安全
    方阵行列式与转置矩阵
    Android笔记(七)Android JetPack Compose组件搭建Scaffold脚手架
    flutter 随机数的生成 四舍五入
  • 原文地址:https://blog.csdn.net/qq_68844357/article/details/125612786