指针笔试题解析(1)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 指针笔试题解析(1)

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


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


解析题1.


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

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


0a2653c851af460fa595bd959398a8f1.png


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

下面进入讲解部分:


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


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


2d65d23f6d4748949b924e4057485923.png


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


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


6de278e6d6694ce5bb08e7e842b7e74b.png


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


struct test
{
  int num;
  char* pcname;
  short spate;
  char ch[2];
  short sba[5];
}*p;
int main()
{
  p = (struct test*)0x100000;
  printf("%p\n", p + 0x1);   //0x1就是十六进制下的1    //00100018
  printf("%p\n", (unsigned long)p + 0x1);           //00100001
  printf("%p\n", (unsigned int*)p + 0x1);            //00100004
  return 0;
}


对于上述的结构体!由于不少人目前,没有接触到结构体大小的计算方法,所以,笔者人为的提供该结构体的大小: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


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


34e8d716411043c08c7ffba9fbba23de.png


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


相关文章
|
6月前
|
机器学习/深度学习 搜索推荐 算法
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
【再识C进阶2(下)】详细介绍指针的进阶——利用冒泡排序算法模拟实现qsort函数,以及一下习题和指针笔试题
|
2月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
4月前
|
SQL 存储 算法
【数据挖掘】恒生金融有限公司2023届秋招数据ETL工程师笔试题解析
恒生科技2022年9月24号数据ETL工程师岗位的笔试题目及答案汇总,包括了SQL选择题、SQL编程题和业务应用SQL编程题,涵盖了数据库基础知识、SQL语句编写以及数据仓库概念等多个方面。
61 2
【数据挖掘】恒生金融有限公司2023届秋招数据ETL工程师笔试题解析
|
4月前
|
机器学习/深度学习 自然语言处理 算法
【数据挖掘】2020奇安信秋招算法方向试卷1 笔试题解析
2020年奇安信秋招算法方向试卷1的题目解析,覆盖了数据结构、机器学习、深度学习、自然语言处理、排序算法、激活函数、主题模型、采样方法、图像处理等多个领域的知识点。
51 1
【数据挖掘】2020奇安信秋招算法方向试卷1 笔试题解析
|
4月前
|
机器学习/深度学习 存储 算法
【数据挖掘】2020奇安信秋招算法方向试卷3 笔试题解析
2020年奇安信秋招算法方向试卷3的题目解析,涵盖了数据结构、机器学习、深度学习、自然语言处理、排序算法、激活函数、PCA、词嵌入库等多个领域的知识点。
63 1
【数据挖掘】2020奇安信秋招算法方向试卷3 笔试题解析
|
6月前
|
存储 C++
有关【指针运算】的经典笔试题
有关【指针运算】的经典笔试题
32 4
|
6月前
|
C++ 存储 Java
C++ 引用和指针:内存地址、创建方法及应用解析
'markdown'C++ 中的引用是现有变量的别名,用 `&` 创建。例如:`string &meal = food;`。指针通过 `&` 获取变量内存地址,用 `*` 创建。指针变量存储地址,如 `string *ptr = &food;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
13天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
43 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
70 0

推荐镜像

更多