• 指针笔试题解析(1)


    指针对于不少人来说:是多么一个难的代名词呀!!当然这个里面也包括笔者!所以……笔者对于指针满满的后怕!但是也有着更多的期待!毕竟阴影是用来打破的!后怕打破了,也就是龙腾虎跃的时候了!!下面进入正题:

    笔者将用代码+解析的方式来带领大家走进:指针!!

    解析题1.

    1. #include <stdio.h>
    2. int main()
    3. {
    4. int a[5] = { 1,2,3,4,5 };
    5. int* ptr = (int*)(&a + 1);
    6. printf("%d %d\n", *(a + 1), *(ptr - 1)); //2 5
    7. return 0;
    8. }

    注意,笔者的代码是在vs2022 的x86环境下进行演示的!请注意细节,若是在vs2022的x64环境下,将会出现不一样的结果!但那个结果也是正确的!

    若是有老铁能直接看懂,并且能够跟答案对上号,那么这篇博客,这位老铁就没有看的必要了,下面内容主要是对上面的代码的讲解!并不做其他的内容!但若是有兴趣,可以进一步欣赏!
    下面进入讲解部分:

    1.由上述的代码,我们可以知道: int (*p)[5]=&a; 指针类型为: int (*)[5] 是一个数组指针!!

    即 &a+1的类型仍为:int (*)[5] ;所以进行(int *)强制类型转化,若不进行强制类型转化,则会出现警告!即ptr指向:数组后面的第一个元素!对于ptr-1则指向元素5的位置!

     2。在a+1中:数组名,是数组的首元素的地址!即元素1的地址,数组名a+1,跳过一个元素,即:指向元素2的地址!在进行解引用(*)得到元素2!

    因此,代码的运行结果为:

     解析题2. (考察的为指针(+ -)加减整数的问题!)

    1. struct test
    2. {
    3. int num;
    4. char* pcname;
    5. short spate;
    6. char ch[2];
    7. short sba[5];
    8. }*p;
    9. int main()
    10. {
    11. p = (struct test*)0x100000;
    12. printf("%p\n", p + 0x1); //0x1就是十六进制下的1 //00100018
    13. printf("%p\n", (unsigned long)p + 0x1); //00100001
    14. printf("%p\n", (unsigned int*)p + 0x1); //00100004
    15. return 0;
    16. }

    对于上述的结构体!由于不少人目前,没有接触到结构体大小的计算方法,所以,笔者人为的提供该结构体的大小:20个字节!!(对于结构体大小略微感兴趣的老铁,敬请关注笔者博客,将会更新!)

    1.在结构体中,定义的全局变量*p,因此,p是一个结构体指针变量!在x86的环境下进行演示!

    2.p的值为0x100000 为十六进制int类型!赋值给结构体,则需要强制类型转化即:
        p = (struct test*)0x100000;

    3.p+0x1 :—》p+1  ;指针+1,到底加的是几??这个就是要取决于指针的类型!!

    p为结构体指针,则p+1需要跳过一个结构体(20个字节)!即 0x100000 (十六进制)+20(十进制),再将所得的结果,转化为:十六进制!!即结果为:0x100014!

    4.(unsigned long)p + 0x1  : p是一个结构体指针类型!(unsigned long)p  将p强制类型转化为:unsigned long型,p里面本来放一个数值,而将p强制类型转化为:(unsigned long)整型,整型+1  :即:0x100001

    5.(unsigned int*)p + 0x1  : 不管p是什么类型,现在将p强制类型转化为:unsigned int* 类型的指针类型,即:p转化完成后,指向一个无符号的整型(4个字节)!整型指针+1,跳过4个字节!即:0x100004

    因此,代码的运行结果为:

    简简单单的两道题!目前已经讲解完毕!接下来,笔者将会给大家,讲解一些 :指针笔试题解析!来供大家参考!!!

  • 相关阅读:
    UVA-122 树的层次遍历 题解答案代码 算法竞赛入门经典第二版
    什么是http请求
    基于北方苍鹰算法的无人机航迹规划-附代码
    Python 教程之运算符(1)—— python 中的基本运算符(上)
    正则表达式
    Linux TCP 通信并发
    golang 结构体标签 -- struct tag (八)
    10 个 JavaScript 单行代码,让你显得更专业
    SSM+Mysql实现的共享单车管理系统(功能包含分角色,登录、用户管理、服务点管理、单车管理、分类管理、学生信息管理、单车租赁、信息统计、系统设置等)
    电池UN38.3试验概要内容有哪些,UN38.3认证
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/126965002