C语言指针笔试题讲解

news2024/11/16 19:50:58

大家好,我们来学习一些C语言的指针笔试题。对于C语言指针的模块想必大家都非常的头疼吧,那么我们就来就来看看一些关于C语言指针的笔试题。

在这里插入图片描述

首先让我们看到我们今天的第一题。

int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0;
}

在这里插入图片描述
看到这个程序运行的结果,我们就好好地来分析下这个题。

在这里插入图片描述

我们看到图片,我们printf语句中的a指的是数组首元素的地址指向的就是图中1位置,a+1就代表数组中第二个元素的地址,所以我们 *(a+1)得到就是第二个元素,我们的指针指向的是图中2位置,因为&a取的是数组的地址,所以&a+1指向的就是图中2位置,ptr-1指向的就是图中3位置,所以我们 *(ptr-1)得到就是第五个元素。

我们看到下一题

//由于还没学习结构体,这里告知结构体的大小是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;
}

在这里插入图片描述

我们看到在x86环境下打印的结果,因为我们的地址在内存中的存储是16进制,所以我们的结构体大小为20个字节,指针结构体加1,跳过一个结构体的大小,我们这里第一个打印就是16进制的20,第二个我们是无符号数的长整型所以加1就是普通加1,所以打印的结果就是00000001,最后一个我们的p是int*类型的指针,所以我们这里就是加4,所以结果就是00000004。

我们继续–>:

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;
}
int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x,%x\n", ptr1[-1], *ptr2);
	return 0;
}

在这里插入图片描述

我们这里依旧是ptr1指向下一组数据,也就是与数组最后一个元素相邻的数据,而打印ptr1[-1]就是ptr1向前挪一个整型也就是4个字节,所以ptr1指向的就是数组的最后一个数据,所以结果就是4。第二个它先是把数组名a强制转换成整型变量,然后再加1,然后再强制转换成整型指针!就是让ptr2指向a[0]的第二个字节,看到下图:
在这里插入图片描述
在这里插入图片描述

ptr2指向了a[0]的第二个字节由于x86平台是小端序的,小端序的存取时最低位对应低地址 ,因此将会打印出2000000。

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

在这里插入图片描述
在这里插入图片描述

我们这里p=a[0]指的是取的二维数组第一行第一个元素的地址,我们要注意括号里的是逗号表达式,逗号表达式的结果就是表达式中最后一个表达式的结果,所以原来数组中存放的值就是{1,3,5}。所以我们这里的p[0]就相当于*(p+0),也就是*p,所以打印的结果为1。

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

在这里插入图片描述
在这里插入图片描述

在这里我们要知道指针减指针得到的是两个地址之间的元素个数,我们首先做出图像,我们发现&a[4][2]取的是第五行第三个元素的地址,而我们定义的*p数组指针,p=a我们就知道这单纯的把数组a的元素被p分为以四个元素为一行,所以我们的&p[4][2]就是我们刚得到的数组的第五行第三个元素的地址,所以两个相减得到-4,然而我们前面还得打印这个数的地址,那么我们首先就得知道地址是以16进制的形式存储的,我们首先得到的是-4的补码,因为负数里存储的是补码,我们给它取反加一得到原码,但我们这个时候是二进制,所以我们要给它转换成16进制,1111代表二进制的15,转换成16进制就是f,而1100代表的是二进制序列的12,所以转换成16进制就是c,所以地址就是fffffffc。

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

在这里插入图片描述
在这里插入图片描述

看了前几个题相信大家对ptr1已经有了更加深刻的理解,我们的ptr1指向的就是下个数据,ptr-1指向就是这个数组最后一个元素,得到的结果就是10,我们这里的aa+1就相当于aa[1],也就是&aa[1][0],所以指向的就是二维数组第二行第一个元素,那我们的ptr2-1指向的就是第一行最后一个元素的地址,所以得到的就是5。

在今天的学习中大家一定都会有些许收货吧,我们下次见,谢谢大家。

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

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

相关文章

AUTOSAR RTE介绍(更新版230925)

RTE是什么 AUTOSAR RTE(Run Time Environment)实现了AUTOSAR系统中的虚拟功能总线(VFB),提供了SWC(Software Component)之间的访问接口和SWC对于BSW资源的访问接口。RTE为SWC中的Runnable提供与其他SWC或者BSW模块通信的接口,RTE将Runnable映射到OS Task中,并且管理Runna…

二进制中1的个数 C++实现

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; const int N100010; int a[N]; int n;int lowbit(int x){return x & -x; }int main(){scanf("%d",&n);for(int i0;i<n;i) scanf("%d",&a[i]);for(int i…

抽检监测实施

声明 本文是学习GB-T 42893-2023 电子商务交易产品质量监测实施指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件提供了开展电子商务交易的有形产品质量监测的总则&#xff0c;监测准备、监测实施、监测效果评价 与反馈等过程指导…

this.$nextTick()的使用场景

事件循环机制&#xff1a; 同步代码执行->查找异步队列&#xff0c;推入执行栈&#xff0c;执行Vue.nextTick[事件循环1]->查找异步队列&#xff0c;推入执行栈&#xff0c;执行Vue.nextTick[事件循环2]->查找异步队列&#xff0c;推入执行栈&#xff0c;执行Vue.nex…

Win10专业版系统一键重装怎么操作?

Win10专业版系统一键重装怎么操作&#xff1f;与传统的系统重装相比&#xff0c;一键重装不仅省去了繁琐的安装步骤&#xff0c;这一简单操作使得系统维护和恢复变得更加便捷&#xff0c;让用户不再为系统问题而烦恼。下面小编给大家详细介绍关于一键重装Win10专业版系统的操作…

使用bash脚本编译Qt工程

最近在搭建Qt工程的编译服务器&#xff0c;需要通过shell脚本执行工程的编译过程&#xff0c;写在这里&#xff0c;总结最近的工作。 1. 构建过程 以Windows为例&#xff0c;在QtCreator中左侧选择“项目”便可以看到编译的指令和参数&#xff0c;这些操作也会在我们点击“构建…

个人博客系统测试报告(一)

作者&#xff1a;爱塔居 专栏&#xff1a;测试 目录 一、项目背景介绍 二、项目功能 三、测试计划 3.1自动化测试用例 3.2 性能测试 ​​​​​​​&#xff08;未完&#xff09; 一、项目背景介绍 个人博客系统前端由注册页、登录页、列表页、详情页、编辑页、个人博客列…

CompletableFuture-通用异步编程

演示Completable接口完全可以代替Future接口&#xff1a; CompletableFuture减少阻塞和轮询&#xff0c;可以传入回调对象&#xff0c;当异步任务完成或者发生异常时&#xff0c;自动 调用回调对象的回调方法。 package com.nanjing.gulimall.zhouyimo.test;import java.util…

postman接口自动化测试框架实战

什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完成的用…

Linux死锁

第三种情况 #include<stdio.h> #include<unistd.h> #include<pthread.h> #include<string.h>pthread_mutex_t mutex1, mutex2; void * workA(void * arg) {pthread_mutex_lock(&mutex1);sleep(1);pthread_mutex_lock(&mutex2);printf("w…

【MySQL】 Java的JDBC编程

文章目录 &#x1f332;数据库编程的必备条件&#x1f38b;Java的数据库编程&#xff1a;JDBC&#x1f38d;JDBC工作原理&#x1f333;建立数据库连接&#x1f4cc;在项目中新建一个包&#xff0c;名字自命名&#x1f4cc;将依赖包导入新建包中&#x1f4cc;DataSource&#xf…

EPLAN_002#常用功能(二)

一、快速添加端子 端子编号 端子定义 批量修改时&#xff0c;当名称出现冲突时&#xff0c;勾选上 端子排排序&#xff0c;可以基于页 二、多层端子的快速建立 有购物车的代表一个端子 三、手动鞍型跳线 标题 四、购物车图标 在导航器中&#xff0c;有购物车是陷进去的表示 在图…

基于微信小程序的线上教育课程付费商城(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Springboot: Spring Cloud Gateway 使用的基本概念及配置介绍

1. SpringCloud 与 SpringBoot的版本映射关系 在已有的Spring Boot项目中增加Spring Cloud&#xff0c;首先要确定使用的Spring Cloud的版本&#xff0c;这取决于项目使用的Spring Boot的版本 SpringCloud 与 SpringBoot的版本映射关系 如果两者的版本不兼容&#xff0c;再会…

【洛谷 P1644】跳马问题 题解(动态规划)

跳马问题 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图 1 1 1 所示。马自左下角 ( 0 , 0 ) (0,0) (0,0) 向右上角 ( m , n ) (m,n) (m,n) 跳。规定只能往右跳&#xff0c;不准往左跳。比如图 1 1 1 中所…

【已解决】PDF文件无法编辑怎么办?

打开PDF文件却发现无法编辑&#xff0c;怎么办&#xff1f; 首先&#xff0c;我们要知道&#xff0c;编辑PDF文件需要用到PDF编辑器&#xff0c;用PDF阅读器打开的话是无法编辑的。所以&#xff0c;先要确定是否用PDF编辑器打开PDF文件。 如果使用PDF编辑器打开后还是无法编辑…

2023-9-25 JZ25 合并两个排序的链表

题目链接&#xff1a;合并两个排序的链表 import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c…

8.定义算法中的函数

在 algorithm2e 宏包中&#xff0c;您可以使用 \SetKwFunction 命令来定义算法中的函数。这个命令用于指定函数的名称和参数列表。以下是如何在算法中定义一个函数的示例&#xff1a; \documentclass{article} \usepackage[linesnumbered,boxed]{algorithm2e}\begin{document}…

Tomcat 开启远程调试

Tomcat 部署的 war包工程开启远程调试 Linux服务器下&#xff0c;编辑Tomcat bin 目录下的 startup.sh 文件 vim startup.sh在第一行加入&#xff1a;(不换行&#xff0c;在同一行) declare -x CATALINA_OPTS"-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:…

C#文件目录

文件所在位置 代码 Console.WriteLine("获取程序的基目录" System.AppDomain.CurrentDomain.BaseDirectory); Console.WriteLine("获取模块的完整路径" System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); Console.WriteLine(&quo…