【指针面试题】-还在为学过指针的理论只是不会实践吗??赶紧来看看这里讲解了许多指针的面试题,带你更好掌握指针!!!

news2025/1/11 22:41:07

🎇作者:小树苗渴望变成参天大树
🧨作者宣言:认真写好每一篇博客
🎊作者gitee:link
在这里插入图片描述

🎉指针笔试题详解

  • 💥前言
  • 💦一、指针和数组面试题解析
    • 💨1.1一维数组
    • 💢1.2字符数组
    • 💤1.3二维数组
  • 🎄二、指针面试题
  • 💖三、总结


💥前言

各位友友们,我们又见面了,答应大家要更新的指针练习题他终于来了,让大家久等了,好,我们开始进入正题。


💦一、指针和数组面试题解析

我们先来补充一个知识点:数组名的意义:

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

💨1.1一维数组

//一维数组
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//数组名单独在sizeof内部表示整个数组,所以计算的是在整个数组的大小,//4*4=16
printf("%d\n",sizeof(a+0));//数组名不是单独在sizeof内部,所以数组名代表首元素地址,a+0还是首元素地址,是地址就是4/8个字节//4/8
printf("%d\n",sizeof(*a));//数组名不是单独在sizeof内部,便是首元素地址,解引用是首元素,sizeof计算的是首元素的大仙,是整型,所以就为4个字节//4
printf("%d\n",sizeof(a+1));//数组名不是单独在sizeof内部,所以数组名代表首元素地址,a+1就是第二个元素的地址,是地址就是4/8个字节//4/8
printf("%d\n",sizeof(a[1]));//a[1]表示数组的第二个元素,计算的是一个整型数的大小,所以是4个字节//4
printf("%d\n",sizeof(&a));//&a取出的整个数组的地址,也是地址,大小为4/8个字节//4/8
printf("%d\n",sizeof(*&a));//&a取出的是整个数组的地址,在进行解引用得到整个数组,大小为16个字节,取地址在解引用等于*&a=a,相当于在sizeof内部单独放了个数组名//16
printf("%d\n",sizeof(&a+1));//&a取出的是整个数组的地址,加1跳过整个数组的地址,是地址就是4/8个字节//4/8
printf("%d\n",sizeof(&a[0]));//&a[0]取出的是数组第一个元素的地址,是地址,大小为4/8个字节//4/8
printf("%d\n",sizeof(&a[0]+1));//&arr[0]取出的是数组第一个元素的地址在加1就是指向数组第二个元素的地址,是地址,大小为4/8个字节。//4/8

特别说明sizeof不存在非法访问的情况,1他不会使用你越界的那块地址,他的运行在编译截断就会完成,我们目前知道就行了,不需要过多去研究。

运行结果:
在这里插入图片描述


💢1.2字符数组

//字符数组
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//数组名单独在sizeof内部,表示整个数组,所以大小为6个字节。//6
printf("%d\n", sizeof(arr+0));//arr不是单独在sizeof内部,所以表示首元素的地址加0还是表示首元素的地址,是地址就是4/8个字节//4/8
printf("%d\n", sizeof(*arr));//arr不是单独在sizeof内部,所以表示首元素的地址,在解引用表示首元素,因为是char类型,所以大小为1个字节//1
printf("%d\n", sizeof(arr[1]));//arr[1]表示数组的第二个元素,大小为1个字节//1
printf("%d\n", sizeof(&arr));//&arr表示整个数组的地址,是地址就是4/8个字节//4/8
printf("%d\n", sizeof(&arr+1));//&arr取出的是整个数组的地址,加1跳过整个数组的地址,是地址就是4/8个字节//4/8
printf("%d\n", sizeof(&arr[0]+1));//&arr[0]取出的是数组第一个元素的地址在加1就是指向数组第二个元素的地址,是地址,大小为4/8个字节。//4/8


size_t strlen(const char* str)


printf("%d\n", strlen(arr));//因为arr表示首元素地址,strlen只有看到\0才会停止下来,所以这个答案是随机值//随机值
printf("%d\n", strlen(arr+0));//arr+0也是表示第一个元素的地址,答案也是随机值//随机值
//printf("%d\n", strlen(*arr));//arr表示数组第一个元素的地址,在解引用表示数组第一个元素,但是strlen只能接收地址,所以会报错//error
//printf("%d\n", strlen(arr[1]));//同上一个//error
printf("%d\n", strlen(&arr));//&arr虽然是数组的地址,但是也是从数组起始位置开始的,计算的还是随机值//随机值
printf("%d\n", strlen(&arr+1));//&arr是数组的地址,&arr+1是跳过整个数组的地址,求字符串长度也是随机值//随机值
printf("%d\n", strlen(&arr[0]+1));//&arr[0] + 1是第二个元素的地址,是'b'的地址,求字符串长度也是随机值//随机值

运行结果:
在这里插入图片描述


char arr[] = "abcdef";//这是一个字符数组,后面默认会有一个\0,在计算数组大小的时候\0算字符串内容,但在计算长度的时候不算在字符串长度内。

printf("%d\n", sizeof(arr));//数组名单独在sizeof内部,计算的是整个数组的大小,所以大小为7个字节//7
printf("%d\n", sizeof(arr+0));//arr不是单独放在sizeof内部,所以arr表示数组名首元素的地址,arr+0也表示数组首元素的地址,是地址大小就是4/8个字节//4/8
printf("%d\n", sizeof(*arr));//arr不是单独放在sizeof内部,所以arr表示数组名首元素的地址,在进行解引用的是得到的首元素,sizeof计算的是一个字符类型的元素大小,所以大小为1个字节//1
printf("%d\n", sizeof(arr[1]));//arr[1]表示数组第二个元素,计算一个字符类型元素的大小,也为1个字节//1
printf("%d\n", sizeof(&arr));//&arr取出的是整个数组的地址,是地址就是4/8个字节//4/8
printf("%d\n", sizeof(&arr+1));//&arr取出的是整个数组的地址,加1跳过整个数组的地址,是地址就是4/8个字节//4/8
printf("%d\n", sizeof(&arr[0]+1));//&arr[0]取出的是数组第一个元素的的地址,加1指向数组的第二个元素的地址,是地址就是4/8个字节//4/8


printf("%d\n", strlen(arr));//arr是数组首元素的地址,从首元素开始计算字符串的长度,到\0停止,所以长度为6//6
printf("%d\n", strlen(arr+0));//arr是数组首元素的地址,arr+0也是数组首元素的地址,所以长度为6//6
printf("%d\n", strlen(*arr));//arr是数组首元素的地址,*解引用得到了首元素a,需要传地址过去,所以会报错//error
printf("%d\n", strlen(arr[1]));//同上一个//error
printf("%d\n", strlen(&arr));//&arr取到的整个数组地址的大小,和首元素的地址大小是相同的,所以计算的长度是6//6
printf("%d\n", strlen(&arr+1));//&arr取到的整个数组地址的大小,加1跳过整个数组,因为后面的空间不知道是啥样的,不知道啥时候找到\0,因为不会访问后面的空间,所以不会出现非法访问,所以这题的长度为随机值//随机值
printf("%d\n", strlen(&arr[0]+1));//&arr[0]取到的是数组首元素的地址,加1跳过一个元素,指向第二个元素的地址,所以从第二个元素开始计算字符串长度,所以长度为5//5

运行结果:
在这里插入图片描述


char *p = "abcdef";//这是一个字符指针用来存取字符串的地址的,p里面保存的是字符串首元素的地址,原因是,有首元素的地址就能找整个字符串,因为有\0作为结束标志。


printf("%d\n", sizeof(p));//p是指针,保存的是地址,是地址大小就为4/8个字节//4/8
printf("%d\n", sizeof(p+1));//p是首元素的地址,p+1指向第二个元素的地址,是地址,大小为4/8个字节
printf("%d\n", sizeof(*p));//p是首元素的地址,*解引用得到首元素a,a是一个字符类型,计算大小为1个字节//1
printf("%d\n", sizeof(p[0]));//同上一个//1
printf("%d\n", sizeof(&p));//&p是取出来的指针变量的地址,是地址,大小就是4/8个字节//4/8
printf("%d\n", sizeof(&p+1));//&p + 1是跳过p变量后的地址,4/8字节
printf("%d\n", sizeof(&p[0]+1));//p[0]就是‘a’,&p[0]就是a的地址,+1,就是b的地址,是地址就是4/8


printf("%d\n", strlen(p));//p是首元素的地址,从这个位置开始计算字符串长度,因为有\0作为结束标志,所以长度为6//6
printf("%d\n", strlen(p+1));//p是首元素的地址,+1指向的是b的地址,从b开始计算长度,为5//5
printf("%d\n", strlen(*p));//*p为元素,应该传地址,所以会报错//error
printf("%d\n", strlen(p[0]));//同上一个//error
printf("%d\n", strlen(&p))//&p拿到的是p这个指针变量的起始地址,找不到\0,所以从这里开始求字符串长度是随机值//随机值
printf("%d\n", strlen(&p+1));//&p+1是跳过p变量的地址,从这里开始求字符串长度也是随机值//随机值
printf("%d\n", strlen(&p[0]+1));//&p[0] + 1是b的地址,从b的地址向后数字符串的长度是5//5

运行结果:

在这里插入图片描述


💤1.3二维数组

//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a));//数组名单独在sizeof内部,计算的是整个数组的大小,为4*3*4=48//48
printf("%d\n",sizeof(a[0][0]));//a[0][0]是数组第一行第一个元素,所以大小为4个字节//4
printf("%d\n",sizeof(a[0]));//a[0]表示的是数组第一行的地址,是单独放在sizeof内部,计算的是第一行全部元素的大小,为4*4=16个字节//16
printf("%d\n",sizeof(a[0]+1));//a[0]作为第一行的数组名,没有单独放在sizeof内部,没有取地址,表示的就是数组首元素的地址,那就是a[0][0]的地址,a[0]+1就是第一行第二个元素的地址,是地址就是4/8个字节//4/8
printf("%d\n",sizeof(*(a[0]+1)));//*(a[0] + 1)是第一行第2个元素,计算的是元素的大小-4个字节//4
printf("%d\n",sizeof(a+1));//a是二维数组的数组名,数组名表示首元素的地址,就是第一行的地址,a+1就是第二行的地址,第二行的地址也是地址,是地址就是4/8  //4/8
printf("%d\n",sizeof(*(a+1)));//a+1是第二行的地址,*(a+1)表示的就是第二行,*(a+1)--a[1]  //16
printf("%d\n",sizeof(&a[0]+1));//&a[0]是第一行的地址,&a[0]+1是第二行的地址,地址的大小就是4/8//4/8
printf("%d\n",sizeof(*(&a[0]+1)));//*(&a[0] + 1) 是对第二行的地址解引用,得到的就是第二行,计算的就是第二行的大小//16
printf("%d\n",sizeof(*a));//a表示首元素的地址,就是第一行的地址,*a就是第一行,计算的就是第一行的大小//16
printf("%d\n",sizeof(a[3]));//如果数组存在第四行,a[3]就是第四行的数组名,数组名单独放在sizeof内部,计算的是第四行的大小//16

运行结果:
在这里插入图片描述

🎄二、指针面试题

第一题:

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

详细图解:
在这里插入图片描述

运行结果:
在这里插入图片描述


💖三、总结

博主花了很长实间用图的放是来和大家讲解指针方面的练习题,希望读者能认真将这些题目弄懂,学会,才是关键,今天的内容很充实,大家可以细心去品味一下这些题目,查缺补漏。那我们今天的讲解就到此结束了,我们下篇再见

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Episode 01 密码技术基础

一、加密和解密&&发送者、接收者和窃听者 发送者&#xff1a;发出消息的人 接收者&#xff1a;接收消息的人 窃听者&#xff1a;恶意获取消息的第三方 加密&#xff1a;发送者将明文转换为密文 解密&#xff1a;接收者将密文还原为明文 破译&#xff1a;接收者以外…

客流统计系统为什么深受门店商户的喜爱?

人数或人群流动信息进行精确的统计分析&#xff0c;而且还可以利用这些高精度的数据&#xff0c;还能获得该区域精确的客流量信息&#xff0c;实现有效合理的组织运营工作&#xff0c;提升工作效益&#xff0c;帮助使用者开展更有成效的组织工作。客流统计系统内置高性能CMOS图…

同源跨域的概念与实现跨域的几种方案

本文将结合周老师的讲义对同源与跨域这一前端经典问题进行系统的总结、整理。一起来坐牢&#xff0c;快&#xff01; 1. 同源限制 1.1 历史背景 - 含义的转变 1995年&#xff0c;同源政策由 Netscape 公司引入浏览器。目前&#xff0c;所有浏览器都实行这个政策。 最初&…

【无标题】javaEE初阶---多线程(面试常用)

这篇文章 , 我将主要介绍多线程进阶部分的内容 . 主要涉及到一些在面试中常考的内容。 一:常见的锁策略 1.1乐观锁和悲观锁 乐观锁 : 预测接下来发生锁冲突的可能性不大 , 而进行的一类操作; 悲观锁 : 预测接下来发生锁冲突的可能性很大 , 而进行的一类操作.乐观锁 : 假设数…

ClassIn:如何打造更稳定的Zabbix监控系统

作者简介&#xff1a;罗呈祥。现就职于北京翼鸥教育科技有限公司&#xff0c;负责数据库相关的运维管理和技术支持工作&#xff0c;擅长故障处理和性能优化&#xff0c;对分布式数据库也有深入研究。 近期&#xff0c;OceanBase 社区发布了一篇关于我们公司选型分布式数据库的文…

bilateral_filter 双边滤波器详细用法

一、双边滤波&#xff08;Bilateral filter&#xff09;是一种可以保边去噪的滤波器。其输出像素的值依赖于邻域像素的值的加权组合。 从效果来说&#xff0c;双边滤波可产生类似美肤的效果。皮肤上的皱纹和斑&#xff0c;与正常皮肤的差异&#xff0c;远小于黑白眼珠之间的差异…

13种Shell逻辑与算术,能写出5种算你赢!

相较于最初的 Bourne shell&#xff0c;现代 bash 版本的最大改进之一体现在算术方面。早期的 shell 版本没有内建的算术功能&#xff0c;哪怕是给变量加1&#xff0c;也得调用单独的程序来完成。 1、算术方法一&#xff1a; $(( )) 只要都是整数运算&#xff0c;就可以在 $(…

DHT11温湿度传感器初识

目录 一、产品概述 1、接线方式 2、特点 3、数据传送逻辑 二、发送时序检测模块是否存在 1、C51单片机&#xff08;主机&#xff09;时序分析 2、编写代码检测模块是否存在 3、读取DHT11数据的时序分析 三、温湿度通过串口传到PC显示 四、温湿度检测小系统——使数据…

Discrete Opinion Tree Induction for Aspect-based Sentiment Analysis 论文阅读笔记

一、作者 Chenhua Chen、Zhiyang Teng、Zhongqing Wang、Yue Zhang School of Engineering, Westlake University, China Institute of Advanced Technology, Westlake Institute for Advanced Study Soochow University 二、背景 如何为每一个方面词定位相应的意见上下文…

反补码运算之 “1 - 1 = - 1 ” ?

我们在研究数据的二进制表示时遇到这样一个问题&#xff1a; 由于计算中的CPU只有加法器&#xff0c;没有减法器&#xff0c;所以在计算机采用原码做减法时对于&#xff1a;1 - 1 0 相当于1 &#xff08;-1&#xff09;&#xff0c;用二进制表示为&#xff1a;000110011001。…

儿童感染新冠病毒后发高烧如何应对?专家来支招

儿童感染新冠病毒后发热较多&#xff0c;但肺炎发展较少儿童感染新冠病毒后发高烧&#xff0c;是重症吗&#xff1f;徐红梅&#xff1a;从目前的接待情况来看&#xff0c;儿童感染新冠病毒后比成人发烧。超过一半的儿童在感染后有发烧症状&#xff0c;伴有咳嗽、鼻塞、流鼻涕、…

JavaWeb的一些学习总结

Web系统就是&#xff1a;前端负责貌美如花&#xff0c;后端负责坚如磐石 企业在做Web系统时&#xff0c;成本与收益的对比是不可忽视的&#xff0c;企业做项目一定是要盈利的&#xff01; 企业做项目最求的不是技术的新和潮&#xff0c;追求的是低成本和稳还有好用度&#xff…

函数的设计

一、默认参数 C允许在函数定义或声明时&#xff0c;为形参指定默认值&#xff0c;即默认参数&#xff08;default argument&#xff09;。 &#xff08;1&#xff09;函数定义与函数声明只能设置一次默认参数。 &#xff08;2&#xff09;可以设置多个默认参数&#xff0c;设…

【精华】搞定JVM调优学习

JVM 介绍 1. 什么是 JVM JVM 是 Java Virtual Machine&#xff08;Java 虚拟机&#xff09;的缩写。一台执行 Java 程序的机器。 2 .JAVA 语言的执行原理 计算机语言&#xff1a; 计算机能够直接执行的指令。这种指令和系统及硬件有关。 计算机高级语言&#xff1a; 在遵循…

「数据」驱动行业拐点,毫末智行冲刺自动驾驶3.0时代

“毫末预计&#xff0c;到2025年中国高阶辅助驾驶搭载率将达到70%。而在汽车新消费领域&#xff0c;中国汽车市场增换购消费比例将达到60%&#xff0c;智能驾驶功能成为必选因素&#xff0c;并迎来商业化的加速发展。”1月5日&#xff0c;第七届HAOMO AI DAY上&#xff0c;毫末…

黑马学ElasticSearch(五)

目录&#xff1a; &#xff08;1&#xff09;DSL查询语法-DSL查询分类和基本语法 &#xff08;2&#xff09;DSL查询语法-全文检索查询 &#xff08;3&#xff09;DSL查询语法-精确查询 &#xff08;4&#xff09;DSL查询语法-地理查询 &#xff08;5&#xff09;DSL查询语…

计算机网络(一)

计算机网络1 概述1.1 计算机网络的作用1.2 因特网概述1.2.1 网络的网络1.2.2 Internet和internet的区别1.2.3 因特网发展的三个阶段1.2.4 ISP介绍1.2.5 ISP分类1.2.5.1 主干ISP1.2.5.2 地区ISP1.2.5.3 本地ISP1.2.6 因特网交换点 IXP1.3 因特网的组成1.3.1 因特网的边缘部分1.3…

资产管理4大难点,如何破解?

随着企业业务扩大、人员增多&#xff0c;固定资产的数量和种类也会随着增加。此时&#xff0c;如何高效管理企业资产就成为很多企业亟待解决的一大难题。 传统资产管理4大难点 01.资产管理部门需要联系采购部门、使用部门、财务部门等收集数据&#xff0c;汇总难且工作量大&…

vacuum移除不必要的CLOG文件

迫切模式弥补了惰性模式的缺陷。它会扫描所有页面&#xff0c;检查表中的所有元组&#xff0c;更新相关的系统视图&#xff0c;并在可能时删除不必要的CLOG文件与页面。当满足以下条件时&#xff0c;会执行迫切模式。pg_database.datfrozenxid<(OldestXmin-vacuum_freeze_ta…

【多线程】【C++ 知识点】pthread_join学习

目录pthread_join进程id和线程idpthread_join pthread_join() 主线程会进入阻塞装题&#xff0c;pthread_join()之后的代码&#xff0c;只有等待子进程退出之后才能执行。 代码块A pthread_create(&id, NULL, Fn, NULL);pthread_create(&id_1, NULL, Fn, NULL);pthre…