C语言指针相关练习题

C语言指针相关练习题

文章目录

  • C语言指针相关练习题
    • 题目一
    • 题目二
    • 题目三
    • 题目四
    • 题目五
    • 题目六
    • 题目七

题目一

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

第一题来说是比较简单的,先来看看代码运行结果
在这里插入图片描述

数组名的理解

  1. sizeof(数组名) 计算的是整个数组的大小
  2. &数组名 取出的是整个数组的地址
  3. 除上面两种情况,数组名都指数组的首元素地址

有了对数组名的理解,这题就好做了
&a+1 取出数组的地址然后+1,指跳过这个数组,指向数组之后的空间
数组地址应存放在数组指针中,int (*p)[ 5 ]中,强制类型转换成 int *类型存放在int *类型的指针中
无论什么类型的指针都可以存放任意类型的地址
*(a + 1) a是首元素的地址,+1指向第二个元素,解引用得到第二个元素 2
*(ptr - 1) ptr存放的是数组+1之后的地址,指向数组之后,-1之后指向数组中最后一个元素 5

题目二

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

代码运行结果如下:
在这里插入图片描述

printf("%p\n", p + 0x1);

%p打印的是地址,0x1表示16进制,也就是1,指针加整数跳过多少字节的空间取决于指针的类型,在上述代码中p是结构体指针,同时题目给的结构体为20个字节,所以p + 0x1 跳过了20个字节,也就是 100014,%p打印的是十六进制的,所以是01000014

printf("%p\n", (unsigned long)p + 0x1);

在上述代码中将p的类型从结构体指针强制类型转换成了unsigned int类型,即无符号整型,p + 0x1也就变成了整数之间的加减,100001,由于是以十六进制的方式打印的,所以是00100001

printf("%p\n", (unsigned int*)p + 0x1);

在上述代码中将p的类型从结构体指针强制类型转换成了unsigned int*类型,是无符号整型指针,指针加减整数取决与类型的大小,unsigned int是4个字节的,所以p + 0x1 跳过了4个字节,也就是100004,由于打印的是十六进制的,所以是00100004

题目三

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

代码运行结果如下:
在这里插入图片描述
在上述代码中,给二维数组进行初始化,对二维数组的初始化得用 { } 才是对数组指定位置的初始化,上述代码中使用的是 ( ),也就是逗号表达式,逗号表达式取最后一个表达式的值,所以对数组初始化只有1,3,5
在这里插入图片描述
然后定义了一个整型指针指向二维数组的首元素,然后跳过p[0]访问的也是首元素,所以打印的是 1

题目四

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

代码运行结果如下:
在这里插入图片描述
指针数组(*p)[4]是指向数组中4个int类型的元素,数组a[5][5]的地址要存到int (*ptr) [5] 这样的数组指针中去,
两者存在着类型差异,但是不影响,a数组每四个元素存到p中去,二维数组是连续存放的,示意图如下:
在这里插入图片描述

&p[4][2] - &a[4][2] 也就是指针 - 指针 的绝对值计算的是两个地址之间的元素个数
所以得到 -4
%p打印的是地址,地址在内存中是补码的形式 十六进制打印
所以我们要将-4转化为二级制的补码
-4的原码1000 0000 0000 0000 0000 0000 0000 0100
-4的反码1111 1111 1111 1111 1111 1111 1011
-4的反码1111 1111 1111 1111 1111 1111 1100
每四个二级制位转换为
FF FF FF FC

%d打印的整型,也就是 -4

题目五

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

代码运行结果如下:
在这里插入图片描述
(int*)(&aa + 1) 是取出数组的地址然后+1,跳过整个数组,指向数组之后的空间,然后将其强制类型转换为int类型存放到ptr1中
(int
)(*(aa + 1))是数组首元素地址+1,二维数组的首元素是a[0],也就是第一行的元素,得到aa[1][0]的地址,然后解引用再强制类型转换,存放到ptr2中
所以ptr1指向的是数组之后的空间,ptr2指向的是数组aa[1][0]
与题目一致
*(ptr1-1) ptr1 - 1 指向的是10这个元素的地址,然后解引用得到10
*(ptr2-1) ptr2 - 1 指向的是5这个元素的地址,然后解引用得到5

题目六

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

代码运行结果如下:
在这里插入图片描述
a[]是个指针数组,存放的是三个字符串的地址,pa指向a的首元素地址,示意图如下:
在这里插入图片描述
pa++,指针偏移一个字节,得到第二个元素的地址,也就是 at
所以打印的是 at

题目七

#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的首元素的,当使用++之后cpp指向了cp的第二个元素,也就是c+2的地址
然后第一次解引用拿到了c+2,
再解引用得到c的第三个元素,所以会打印POINT
现在cpp指向cp的第二个元素

 printf("%s\n", *--*++cpp+3);

由于加法的优先级最低,使用+3最后计算
++cpp,cpp从指向cp的第二个元素变成了指向第三个元素
解引用拿到了cp第三个元素c+1
然后再–c+1得到c这个地址
解引用就得到c 也就是c的首元素ENTER
最后+3 从第四个字符开始打印
所以会打印ER
现在cpp指向cp的第三个元素

 printf("%s\n", *cpp[-2]+3);

cpp[-2] 等价于 *( *(cpp-2))+3
cpp-2,cpp从指向第三个元素变成了指向第一个元素
第一次解引用得到 c+3
第二次解引用得到了c+3指向的元素 也就是FIRST
最后再+3 从这个元素的第四个字符开始打印
所以会打印ST
现在cpp还是指向第三个元素

 printf("%s\n", cpp[-1][-1]+1);

cpp[-1][-1]+1 等价于 *( *(cpp-1)-1)+1
cpp-1 cpp从指向cp第三个元素变成指向了第二个元素
然后解引用得到c+2
然后再减去1 c+2-1
然后解引用得到了c+1 也就是NEW
最后再+1 从第二个字符开始打印
所以会打印EW

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

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

相关文章

[Unity+OpenAI TTS] 集成openAI官方提供的语音合成服务,构建海王暖男数字人

1.简述 最近openAI官方发布了很多新功能&#xff0c;其中就包括了最新发布的TTS语音合成服务的api接口。说到这个语音合成接口&#xff0c;大家可能会比较陌生&#xff0c;但是说到chatgpt官方应用上的聊天机器人&#xff0c;那个台湾腔的海王暖男的声音&#xff0c;可能就有印…

轻量封装WebGPU渲染系统示例<38>- 动态构建WGSL材质Shader(源码)

实现原理: 基于宏定义和WGSL功能文件实现 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/DynamicShaderBuilding.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#x…

前缀和及差分数组

前缀和 原数组x0x1x2x3x4x5前缀和数组x0x0x1x0x1x2x0x1x2x3x0x1x2x3x4x0x1x2x3x4x5前缀和数组代数形式x0’x1’x2’x3’x4’x5’ 计算原数组某区间的和 sum[x1,x2,x3] 利用前缀和计算 x3-x0 x0x1x2x3-x0 x1x2x3 差分数组 x0x1x2x3x4x5原数组x0x1x2x3x4x5差分数组x0x1-x0x…

HTTP四大参数类型及请求参数的方式和如何接收

HTTP 请求中4大参数类型和接收方法。 1、请求头参数head 请求头参数顾名思义&#xff0c;是存放在请求头中发送给服务器的参数&#xff0c;服务器通过解析请求头获取参数内容。通常会存放本次请求的基本设置&#xff0c;以帮助服务器理解并解析本次请求的body体。 参数形式如…

srs的webrtc信令分析

关于webrtc的流信令只有四个 /rtc/v1/publish/&#xff0c;这是推流接口&#xff0c;是推流客户端跟SRS交换SDP的接口 /rtc/v1/play/&#xff0c;这是拉流接口&#xff0c;是拉流客户端跟SRS交换SDP的接口 /rtc/v1/whip/&#xff0c;这也是推流接口&#xff0c;作用是也是交换…

C#开发的OpenRA游戏之属性RenderSprites(8)

C#开发的OpenRA游戏之属性RenderSprites(8) 本文开始学习RenderSprites属性,这个属性是跟渲染有关的,因此它就摄及颜色相关的内容,所以我们先来学习一下调色板,这是旧游戏的图片文件保存的格式,如果放在现代来看,不会再采用这种方法,毕竟现在存储空间变大,便宜了,并…

idea编译问题导致接口调用不通

问题背景&#xff1a; 1.idea版本2021&#xff0c;springboot&#xff0c;父子maven项目&#xff0c;创建了一个新的model。启动之后&#xff0c;调试controller接口&#xff0c;接口一直报404。 问题分析&#xff1a; 1.查看编译后的文件&#xff0c;发现java代码一直没编译…

Vue3使用dataV报错问题解决

DataV官网&#xff1a;https://datav-vue3.jiaminghi.com/guide/ vue2中是没有问题的&#xff0c;这是第一次在vue3中使用发现的报错问题 报错问题 首先安装&#xff1a; pnpm add dataview/datav-vue3 1. 全局注册报错 然后main.ts全局注册 import { createApp } f…

html网站-关于发展历程的案例

一、案例一 1.效果图&#xff1a; 2.代码&#xff1a; 所用到的文件自行在官网下载&#xff0c;也可在git上拉取。 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><meta…

USB驱动开发基础

USB标准 USB1.0&#xff0c; 1996&#xff0c;低速1.5Mbps和高速12Mbps&#xff0c;USB1.1 iMac G3&#xff0c;Type A和Type B接口USB 2.0 2000&#xff0c; 480Mpbs&#xff0c;Type A/B/C接口、Micro A/BUSB 3.0 5Gbps, 随着USB 3.2命名规定&#xff0c;现在也叫USB 3.2 Ge…

Nginx模块开发之http过滤器filter

文章目录 什么是过滤模块Nginx相关数据结构介绍ngx_module_t的数据结构ngx_http_module_t数据结构ngx_command_s数据结构 相关宏定义filter&#xff08;过滤器&#xff09;实现Nginx模块开发流程Nginx 模块执行具体实现流程create_loc_confmerge_loc_confpostconfiguration修改…

使用OkHttp库爬取百度云视频详细步骤

目录 摘要 一、OkHttp库简介 二、爬虫基本概念 三、使用OkHttp库爬取百度云视频 1、发送HTTP请求 2、处理响应 3、下载文件 四、可能遇到的问题及解决方案 五、注意事项 总结与建议 摘要 本文将详细介绍如何使用OkHttp库爬取百度云视频。文章首先简要介绍OkHttp库和…

GPIO模式详解:推挽/开漏/浮空/上拉/下拉/施密特(迟滞)输入

GPIO(General Purpose Input Output)可用于执行数字输入或输出功能。典型的应用包括从/向模拟或数字传感器/设备读写数值、驱动LED、为I2C通信驱动时钟、生成外部组件的触发、发出中断等。 文章目录 1 GPIO简介2 输出模式2.1 推挽输出2.2 开漏输出 3 输入模式3.1 高阻态(浮空)、…

推荐一款适合做智慧旅游的前端模板

目录 前言 一、功能介绍 二、前端技术介绍 三、功能及界面设计介绍 1、数据概览 2、车辆监控 3、地图界面 4、其它功能 四、扩展说明 总结 前言 智慧旅游是一种全新的旅游业务模式&#xff0c;它充分利用先进的信息技术&#xff0c;提升旅游体验&#xff0c;优化旅游管…

【Axure高保真原型】树形表格

今天和大家分享树形表格的原型模板&#xff0c;点击树的箭头可以打开或者收起子节点&#xff0c;点击表格内容&#xff0c;可以选中该行内容实现高亮变色效果&#xff0c;树形表格是通过中继器制作的&#xff0c;使用简单&#xff0c;只需要按要求填写中继器表格即可&#xff0…

2023亚太杯数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法&#xff1f;2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法&#xff1f; 粒子群算法&#xff08;Pa…

安防监控视频融合平台EasyCVR定制化页面开发

安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索…

Django 模型和Admin站点管理(三)

一、定义模型 &#xff08;1&#xff09; 创建模型类&#xff0c;必须要继承自 models.Model from django.db import models# Create your models here. #设计数据库 #创建模型 class UserModel(models.Model):namemodels.CharField(max_length30) #对应于SQL name varchar(30…

K8s实战RestartPoliy策略

一、默认策略为Always cmd.yaml apiVersion: v1 kind: Pod metadata:name: myapp-pod labels:app: myapp spec: containers:- name: myapp-container image: busyboxcommand: [sh, -c, echo OK!&& sleep 60]首先我们根据这个yaml创建一个测试的pod 执行命令 kubec…

深度之眼Paper带读笔记GNN.08.GCN(下)

文章目录 前言细节四&#xff1a;卷积核介绍图卷积核初代目图卷积核二代目契比雪夫多项式例子小结 GCN公式推导 实验设置和结果分析数据集节点分类任务消息传递方式比较运行效率 总结关键点创新点启发点 代码复现train.pyutil.pymodel.pylayer.py 作业 前言 本课程来自深度之眼…