• c语言指针运算


    文章目录
    前言
    一、指针和数组笔试题解析
    1.1 一维数组
    1.2 字符数组
    1.3 二维数组
    2. 指针笔试题
    总结
    前言
    指针面试题,对指针的理解不再停留在简单的知识层面上,而是可以知道面试题中指针的考察是怎样的;

    一、指针和数组笔试题解析
    1.1 一维数组
    首先说一下知识点:很重要!!!
    数组名的意义:

    sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
    &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
    除此之外所有的数组名都表示首元素的地址。
    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]) );

    1. 指针笔试题
      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
    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
    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;
    }

    总结
    指针的博客就告一段落了,敬请期待后面的博客吧!!!

  • 相关阅读:
    [航海协会]数论
    Redis7.2.3集群安装,新增节点,删除节点,分配哈希槽,常见问题
    【通义千问】Qwen从本地加载分词器报错‘‘tokenizer class not exist‘‘
    数据在内存中的存储
    案例:ELK日志分析系统
    NR 物理层编码 卷积码8-slide
    企业文件传输速度慢?宽带利用率不高怎么办?
    SL1588A 18V转3.3V、5V、12V/ 2A同步降压稳压器
    CEC2013(MATLAB):​白鲸优化算法(Beluga whale optimization,BWO)​求解CEC2013
    Bean的作用域Request级别出现错误
  • 原文地址:https://blog.csdn.net/m0_71905144/article/details/126085914