C语言--- 指针运算笔试题详解

news2024/10/5 17:26:23

目录

题目1:

题目2:

题目3:

题目4:

题目5:

题目6:

题目7:


 

题目1:

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

解析:

a是数组首元素的地址,类型为int*,+1跳过一个元素,再解引用就是第二个元素。

&a是整个数组的地址,+1跳过整个数组,再强制类型转化为int*类型,-1就是数组最后一个元素的地址,解引用后就是最后一个元素。

答案:

2,5

题目2:

struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p = (struct Test*)0x100000;
//在X86环境下
//假设结构体的⼤⼩是20个字节
//程序输出的结构是啥?
int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

解析:

p是一个指针,类型是struct Test*,是由十六进制数字0x100000强制类型转换为struct Test*类型所得到的。

0x1就是1,p+1就是跳过一个元素,一个结构体的大小是20个字节,地址就加20,变成0x00100014.将p强制类型转化为unsigned long类型的值再加1,就是单纯的数学运算,结果是0x00100001.将p强制类型转化为unsigned int*类型的指针,+1跳过4个字节就是0x00100004

题目3:

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

 解析:

a数组是一个二维数组,但是初始化的是用的括号,括号的结果是逗号表达式的结果,也就是最后一个逗号后面的表达式的值。这个数组初始化的值前三个分别是1,3,5,其余默认是0

a[0]是第一行的数组名,也就是第一行首元素的地址,p[0]可以写成*p,所以就是第一个元素。结果就是1.

题目4:

//假设环境是x86环境,程序输出的结果是啥?
#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]);
 return 0;
}

 解析:

二维数组的元素在内存中也是连续排列,所以a数组也可以看成一个元素个数为25个的一维数组。

a是第一行的地址,类型是int *[5],p是int *[4],&p[4][2]就可以看成第(3 * 4 + 3)个元素的地址,&a[4][2]就是第(3 * 5 + 3)个元素的地址,指针相加减得到的是地址之间的元素个数,也就是4个元素,但是值是-4,分别以十六进制和十进制打印,整数在内存中是以补码的形式存储,所以-4的十六进制,和十进制分别是

//1000 00000000 00000000 00000000 0011 原码
//1111 11111111 11111111 11111111 1100 反码
//1111 11111111 11111111 11111111 1101 补码
//F    F   F    F   F    F   F    C

题目5:

#include <stdio.h>
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;
}

&aa是整个数组的地址,+1跳过整个数组转化为int*类型后 ,-1向前跳过4个字节,也就是数组最后一个元素的地址,再解引用就是 10

*(aa+1)就是aa[1],第二行的数组名,第二行首元素的地址,转化为int*后,-1就是第一行最后一个元素的地址,再解引用就是5.

题目6:

#include <stdio.h>
int main()
{
 char *a[] = {"work","at","alibaba"};
 char**pa = a;
 pa++;
 printf("%s\n", *pa);
 return 0;
}

解析:

a数组是一个元素类型为char*类型的地址,a是数组名,也是数组首元素的地址,也就是一个二级指针,因为它指向的元素也是一个指针,pa++,就变成了第二个元素的地址,解引用后就是字符串at。

题目7:

#include <stdio.h>
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;
}

解析:

	printf("%s\n", **++cpp);
	//cpp是cp数组首元素的地址,也就是c+3的地址
	//++cpp,就变成了c+2的地址
	//*++cpp,就是c+2
	//c是"ENTER"的地址
	//c+2就是"POINT"的地址
	//再解引用就是"POINT"
	//打印POINT
	printf("%s\n", *-- * ++cpp + 3);
	//++cpp,就变成了c+1的地址
	//*++cpp,就是C+1,
	//c+1就是"NEW"的地址
	//再--,就是"ENTER"的地址
	//再*就是"ENTER",首字符的地址,然后+3,就是"E"的地址,
	// 最后打印ER
	printf("%s\n", *cpp[-2] + 3);
	//cpp[-2]就是*(cpp-2)
	//cpp-2就是C+3的地址
	//*后就是C+3
	//再*就是"FIRST",然后加3,就是"S"的地址,
	//打印ST
	printf("%s\n", cpp[-1][-1] + 1);
	//cpp[-1][-1]就是*(*(cpp-1)-1)
	//cpp-1就是C+2的地址,
	//*后就是C+2,-1,就是C+1
	//C+1是"NEW"的地址,*后就是"NEW",+1就是"E"的地址,
	//打印EW

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

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

相关文章

C#与WPF通用类库

个人集成封装&#xff0c;仓库已公开 NetHelper 集成了一些常用的方法&#xff1b; 如通用的缓存静态操作类、常用的Wpf的ValueConverters、内置的委托类型、通用的反射加载dll操作类、Wpf的ViewModel、Command、Navigation、Messenger、部分常用UserControls(可绑定的Passwo…

蓝桥杯-ISBN号码

此题然让本人纠结了很久&#xff0c;真的好多坑。。。。果然还是太菜了。 完整代码以及思路解析(在注释中) #include <iostream> using namespace std; int main() {string num;cin>>num; int count0;int w1;for(int i0;i<10;i){if((i!1)&&(i!5)) //坑…

Node.js作用

Node.js可以开发应用 开发服务器应用 开发工具类应用 开发桌面端应用

Discord OAuth2授权以及机器人监听群事件

下面文章讲解获取OAuth2授权整个流程&#xff0c;创建机器人&#xff0c;使用机器人监听工会&#xff08;工会就是创建的服务器&#xff09;成员变化等等&#xff0c;对接国外的都是需要VPN的哦&#xff0c;对接的时候记得提前准备。 创建应用 点击 此页面添加应用,&#xff…

EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测

EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测 目录 EI级 | Matlab实现GCN基于图卷积神经网络的数据多特征分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.GCN基于图卷积神经网络的数据分类预测 Matlab2023 2.多输入单输出的分类预测&#xf…

汽车电子:均胜电子、德赛西威“跑出”第二增长曲线

问界新M7上市以来销量势如破竹&#xff0c;华为汽车及相关均胜电子、联创电子、光峰科技等供应链企业也因此受益。 网络公开数据&#xff0c;在2024年1月1日-2月18日&#xff0c;中国市场新势力品牌销量排行榜中&#xff0c;问界就以4.25万辆的销量成绩霸榜第一&#xff0c;作…

幻兽帕鲁Palworld服务器搭建费用,仅需26元!

2024阿里云幻兽帕鲁专用服务器价格表&#xff1a;4核16G幻兽帕鲁专用服务器26元一个月、149元半年&#xff0c;默认10M公网带宽&#xff0c;8核32G幻兽帕鲁服务器10M带宽价格90元1个月、271元3个月。阿里云提供的Palworld服务器是ECS经济型e实例&#xff0c;CPU采用Intel Xeon …

政务网站安全合规之道,云监测提供优质监测解决方案

近年来&#xff0c;国家对于网站安全风险的问题重视程度不断提升&#xff0c;持续加强对网站安全的监管力度。特别是政务网站&#xff0c;承载着越来越重要的核心应用和数据&#xff0c;与普通网站相比更容易遭到来自互联网的攻击。 攻击者为了破坏政务形象、干扰政务工作秩序或…

RC4算法:流密码算法的经典之作

title: RC4算法&#xff1a;流密码算法的经典之作 date: 2024/3/11 18:16:16 updated: 2024/3/11 18:16:16 tags: RC4起源演变算法优劣分析RC4 vs AES安全性RC4 vs DES性能比较应用场景介绍工作原理详解代码实例演示 一、RC4算法的起源与演变 RC4算法是由著名密码学家Ron Riv…

Oracle数据库迁移至达梦8数据库(windows图文讲解)

写作不易&#xff0c;如果对各位有用请给个赞支持一下~ 1.第一步安装达梦8数据库&#xff1a; 下载安装看我这篇博客 https://blog.csdn.net/li836779537/article/details/136641411?spm1001.2014.3001.5502 2.废话不多说直接开干&#xff0c;安装完成后打开迁移工具 名字…

指令微调(Instructional Fine-tuning)

定义 指令微调&#xff08;Instructional Fine-tuning&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;特别是在大型预训练语言模型&#xff08;如 GPT、BERT 等&#xff09;的应用中。在指令微调中&#xff0c;模型被进一步训练以更好地理解和遵循…

Linux--ELK 日志分析系统

ELK &#xff08;Elasticsearch、Logstash、Kibana&#xff09;日志分析系统的好处是可以集中查看所有服务器日志&#xff0c;减轻了工作量&#xff0c;从安全性的角度来看&#xff0c;这种集中日志管理可以有效查询以及跟踪服务器被攻击的行为。 > Elasticsearch 是个开源分…

容器安全是什么?

容器安全定义 容器安全是指保护容器的完整性。这包括从其保管的应用到其所依赖的基础架构等全部内容。容器安全需要完整且持续。通常而言&#xff0c;企业拥有持续的容器安全涵盖两方面&#xff1a; 保护容器流水线和应用保护容器部署环境和基础架构 如何将安全内置于容器流…

[BUG] docker运行Java程序时配置代理-Dhttp.proxyHost后启动报错

[BUG] docker运行Java程序时配置代理-Dhttp.proxyHost后启动报错 bug现象描述 版本&#xff1a;2.0.4&#xff08;客户端和服务端都是&#xff09; 环境&#xff1a;私有云环境&#xff0c;只有少量跳板机器可以访问公网&#xff0c;其他机器均通过配置代理方式访问公网 bug现…

CSS中grid网格布局详解

文章目录 一、是什么二、属性display 属性grid-template-columns 属性&#xff0c;grid-template-rows 属性grid-row-gap 属性&#xff0c; grid-column-gap 属性&#xff0c; grid-gap 属性grid-template-areas 属性grid-auto-flow 属性justify-items 属性&#xff0c; align-…

数据结构 之 链表LinkedList

目录 1. ArrayList的缺陷&#xff1a; 2. 链表&#xff1a; 2.1 链表的概念及结构&#xff1a; 3. 链表的使用和模拟实现&#xff1a; 3.1 构造方法&#xff1a; 3.2 模拟实现&#xff1a; 4. 源码分享&#xff1a; 在我学习顺序表之后&#xff0c;我就立马开始了链表的学…

idea 导入项目

idea 导入项目并运行 导入设置设置 jdk查看maven 设置 导入 在项目首页 或者 file 选择 open, 然后选择项目根路径 设置 设置 jdk 查看maven 设置

Vue 中的 key:列表渲染的秘诀

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

基于eleiment-plus的表格select控件

控件不是我写的&#xff0c;来源于scui,但在使用中遇到了一些问题&#xff0c;希望能把过程记录下来&#xff0c;同时把这个问题修复掉。 在使用的时候对控件进行二级封装&#xff0c;比如我的一个商品组件&#xff0c;再很多地方可以用到&#xff0c;于是 <template>&l…

SQLiteC/C++接口详细介绍-sqlite3类(一)

上一篇&#xff1a;SQLiteC/C接口简介 下一篇&#xff1a;SQLiteC/C接口详细介绍&#xff08;二&#xff09; 引言&#xff1a; SQLite C/C 数据库接口是一个流行的SQLite库使用形式&#xff0c;它允许开发者在C和C代码中嵌入 SQLite 基本功能的解决方案。通过 SQLite C/C 数据…