指针笔试题解析(3)

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

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


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

第一题!


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

注意,笔者的代码是在vs2022 的x86环境下进行演示的!请注意细节,若是在vs2022的x64环境下,出现不一样或者一样的结果!但结果都是正确的!(笔者亲测,在vs2022中x64的环境下,笔者讲解的部分指针笔试题解析,有着不一样的结果!但都是正确的!!)


0a2653c851af460fa595bd959398a8f1.png


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

下面进入讲解部分:


1.首先对于数组:int arr[3][2] = { (0,1),(2,3),(4,5) };  笔者在这里面,小小的考验一下读者:对于前面所讲述的逗号表达式,是否已经忘记??在这儿强调一下!!所以上述数组初始化后实际初始化的内容为:1,3,5,因此整个数组初始化后内容为:int arr[3][2] = { 1,3,5,0,0,0}!笔者在刚刚接触到这个数组时候,也是巧妙地被……栽坑里面了!!


2.对于数组:  arr[3][2] = { 1,3,5,0,0,0}  


2d65d23f6d4748949b924e4057485923.png


int *p  :整型指针,arr[0] 为第一行的数组名,arr[0]没有单独放在sizeof内部,也没有进行&arr[0], 所以,数组名表示首元素的地址,即元素1的地址!p=arr[0],指的意思为:p=&arr[0][0],所以指向元素1, 对于: p[0]指: *(p+0)—》*p ;指向第一个元素1,即打印结果为1!!


代码的运行结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


第二题:


#include <stdio.h>
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]);  //FFFFFFFC  -4
  return 0;
}

对于这个题目,感觉很有难度!!若是读者能够自己看懂!已经很算是大佬级别人物!!下面请看笔者解析!


首先,笔者先进行简单提示一下:指针(地址)减去指针(地址)计算的是两个指针之间的元素个数!!


1.对于:int(*p)[4]  ;p是一个指针,它能指向一个数组,4个元素,每个元素都为int (整型)!p=a;将a赋值给p, a是数组名,表示数组首元素的地址!即为第一行的地址!a的类型为:int (*)[5]是一个指针数组,而p 的类型为: int (*)[4]; 与a的类型不一样,会发生警告!!


12c3b7f3f8814309a195c64f051d4445.png


2.int (*p) [4]  : 指向4个元素,每个元素为int 类型!p+1, p+2, p+3,p+4,在图上分别标注出来:


34e8d716411043c08c7ffba9fbba23de.png


p[4][2]相当于: *(*p+4)+2) ;  整型的数组指针:解引用的时候,有权利访问4个字节!


3.随着数组下标的增长,地址由低到高!


92ba0822ed0b46e1ae72df8a17d3a45b.png


对于:&p[4][2] - &a[4][2]  以%d打印时候:小地址减去大地址!(之间的元素个数为4个)所以结果为-4!!


&p[4][2] - &a[4][2]  以%p打印时候:


-4的原码为:1000000000000000000000000000000100


    反码为:  111111111111111111111111111111111111011


    补码为:  111111111111111111111111111111111111100


但是以%p的形式打印,并不讲究原码,反码,补码的问题!但是由于在内存中存放的是补码!所以将:补码: 111111111111111111111111111111111111100当作了地址来进行打印!


4个二进制位为一个16进制位!而且4个1为一个F,所以上面划算后的结果为:FFFFFFFC!!


代码的运行结果为:


d79b274929334152a6d38be91e2d1be3.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;`。引用不可为空且不可变,指针可为空且可变,适用于动态内存和复杂数据结构。两者在函数参数传递和效率提升方面各有优势。 ```
|
2月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
28 0
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。

推荐镜像

更多