C语言学习(二十七)---指针练习题(三)

news2024/9/27 9:20:39

在上一节的内容中,我们继续学习了字符数组的相关指针练习题,今天我们将继续将练习有关二维数组的指针练习题和有关结构体的指针练习题,好了,话不多说,开整!!!!

二维数组练习题

请分析如下代码,不要直接运行得到结果,代码如下:

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

在分析完成后,再查看以下分析:

#include<stdio.h>
int main()
{
    int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};//定义了一个二维数组
    printf("%d\n",sizeof(a));//此时的a在sizeof内部,代表整个数组,因此,数组内元素又为整型,故结果为:3*4*4 = 48字节
    printf("%d\n",sizeof(a[0][0]));//a[0][0]代表第一行第一列的元素,其为整型,因此大小为4字节
    printf("%d\n",sizeof(a[0]));//一维数组中,a就代表首元素地址,除了两种特殊情况外,
    //而在二维数组中,a[0]代表的是二维数组中首元素,二维数组中的首元素为第一行;
    //此时a[0]代表数组中第1行,因此,大小为4*4 = 16
    printf("%d\n",sizeof(a[0]+1));//此时并非两种特殊情况,因此a[0]代表第一行的首元素地址,再加1为第一行第二个元素的地址
    //地址则为4字节(32位)
    printf("%d\n",sizeof(*(a[0]+1))); //第一行第二个元素的地址解引用,就是取出来1行2列的元素,整型因此为4字节
    printf("%d\n",sizeof(a+1));//a相当于a[0],即二维数组中首元素也就是第一行的地址,再加1为二维数组中第二个元素也即第二行的地址
    //地址为4字节
    printf("%d\n",sizeof(*(a+1))); //a+1为第二行元素的地址,解引用也就是第二行所有元素,大小为4*4 = 16字节
    printf("%d\n",sizeof(&a[0]+1));//a[0]:第一行首元素地址,&a[0]:代表第一行的整个数组的地址,
    //再加1为第二行的地址,4字节
    printf("%d\n",sizeof(*(&a[0]+1)));//对数组的第二行解引用,整型,大小为4字节*4= 16字节
    printf("%d\n",sizeof(*a));//第一行解引用,4*4 = 16字节
    printf("%d\n",sizeof(a[3])); 
    //sizeof会去访问a中到底有没有第四行,只是根据类型计算大小,因此不会报错
    //a[3]代表第四行,因此大小为4*4 = 16字节
    return 0;
}

其中不是很好理解的可以见下图:
在这里插入图片描述
编译查看结果:
在这里插入图片描述
和我们分析的一致,因此分析没有错误

结构体指针练习题

下面进行结构体指针练习题,代码如下,请分析:

#include<stdio.h>
struct Test
{
        int num;
        char* pc;
        short sd;
        char cah[2];
        short sba[4];
}* p; //定义一个结构体指针
int main()
{
        p = (struct Test*) 0x00100000;//假设该指针的地址为这个地址
        printf("%p\n",p+0x1);
        printf("%p\n",(unsigned long)p + 0x1); 
        printf("%p\n",(unsigned int*)p + 0x1);
        return 0;
}

再分析完成后,再查看以下内容:

#include<stdio.h>
struct Test
{
        int num;
        char* pc;
        short sd;
        char cah[2];
        short sba[4];
}* p; //定义一个结构体指针
int main()
{
        p = (struct Test*) 0x00100000;//假设该指针的地址为这个地址
        printf("%p\n",p+0x1);//0x表示16进制,也就是结构体指针加1,将会越过整个结构体:0x00100000+4+4+4+2*1+4*4 =0x001000014
        printf("%p\n",(unsigned long)p + 0x1); //将指针p强制转换为无符号长整型,再加1,可得0x00100000+1 = 0x00100001
        printf("%p\n",(unsigned int*)p + 0x1);//将指针p强制转换为无符号整型指针加1,,故加4,可得0x00100000+4 = 0x00100004
        //结果应该为0x100004
        return 0;
}

编译运行,得到以下结果:
在这里插入图片描述
因此分析无误。

一维数组补充练习题

请分析以下代码,其中%x为打印16进制的符号:

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

再分析完成后,查看以下分析,
首先分析p1,如下图:
在这里插入图片描述
因此,结果将为4,接下来分析p2,如下图:
在这里插入图片描述
下面我们验证是否正确:
在这里插入图片描述
和分析的一致,因此分析正确。

上述内容即使今天的全部内容了,感谢大家的观看,至此,有关指针的练习题也基本结束了,辛苦大家了。

如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

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

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

相关文章

从零开始学习:如何使用Selenium和Python进行自动化测试?

安装selenium 打开命令控制符输入&#xff1a;pip install -U selenium 火狐浏览器安装firebug&#xff1a;www.firebug.com&#xff0c;调试所有网站语言&#xff0c;调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件&#xff0c;实现简单的浏览器操 作的录制与回…

开源社 KCC@硅谷正式成立,搭建国际开源交流平台

大家好&#xff01;我很高兴向大家宣布一个重要的消息&#xff1a; 开源社在硅谷的KCC&#xff08;Kaiyuanshe City Community&#xff09;正式成立了&#xff01;作为开源社的一项重要举措&#xff0c;KCC硅谷将成为国际开源交流的桥梁&#xff0c;架起中国和全球开源社区之间…

第十八章、Spring中的事务属性:隔离、传播属性等

1.什么是事务属性 属性&#xff1a;描述物体特征的一系列值 事务属性&#xff1b;描述事务特征的一系列值 1. 隔离属性 2. 传播属性 3. 只读属性 4. 超时属性 5. 异常属性2.如何添加事务属性 Transactional(isloation,propagation,readOnly,timeout,rollbackFor,norollbackFo…

three.js中物体的灯光与阴影设置

一、.设置物体阴影的核心步骤 1. 以平面上有一个球体为例&#xff0c;设置球体的阴影投射到平面上&#xff0c;核心步骤如下&#xff1a; 要让球体的阴影照射到平面上&#xff0c;需要使用阴影映射技术。具体步骤如下&#xff1a; 在渲染器中启用阴影&#xff1a; renderer…

高速下载ChatGLM2模型文件的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

无法使用MBR2GPT创建EFI系统分区?试试这方法!

将MBR转换为GPT的原因 你可能已经了解了GPT和MBR这两种不同类型的磁盘。由于硬盘容量一直在不断增加&#xff0c;人们现在更偏向于使用GPT磁盘。相较于MBR磁盘&#xff0c;GPT磁盘支持更大的存储空间&#xff0c;其限制超过了2TB。另外&#xff0c;GPT磁盘允许几乎无限数量…

【网络编程】网络基础(一)

文章目录 一、计算机网络背景1.网络发展2.认识 "协议" 二、网络协议初识1.协议分层2.OSI七层模型3.TCP/IP五层(或四层)模型 三、网络传输基本流程1.网络传输流程图2.数据包首部&#xff08;报头&#xff09;3.数据包封装和分用封装分用 4. 跨局域网主机通信 四、网络…

【C站话题】如何看待调查称半数年轻人存款不足10万?

*近日&#xff0c;有调查称“大概五分之一的年轻人存款在一万元以内。10万元存款是一个“坎”&#xff0c;存款超过10万就会超过53.7%的人。”“年轻人”“存款”两个词碰撞在一起&#xff0c;引来了广泛的关注和讨论。你认为年轻人存款难吗&#xff1f;可以从以下几个角度发表…

多模态大语言模型 LlaVA 论文解读:Visual Instruction Tuning

代码&#xff1a;https://github.com/haotian-liu/LLaVA 总览 在这篇论文中&#xff0c;作者首次尝试使用纯语言 GPT-4 生成多模态语言图像指令遵循数据&#xff08;insruction-following data&#xff09;。 通过对此类生成数据进行指令调整&#xff0c;推出了大型语言和视觉…

RocketMQ --- 实战篇

一、案例介绍 1.1、业务分析 模拟电商网站购物场景中的【下单】和【支付】业务 1.1.1、下单 流程 用户请求订单系统下单 订单系统通过RPC调用订单服务下单 订单服务调用优惠券服务&#xff0c;扣减优惠券 订单服务调用调用库存服务&#xff0c;校验并扣减库存 订单服务调…

MiniGPT4模型训练与部署

第二式&#xff1a;MiniGPT4模型训练与部署 1.环境搭建1.1 下载MiniGPT-4代码1.2 创建虚拟环境 2.Vicuna模型准备2.1 下载vicuna delta weights2.2 下载原始llama weights2.3 合成真正的working weights2.4 配置Vicuna模型路径 3. MiniGPT-4 checkpoint准备3.1 下载MiniGPT-4 c…

《二叉搜索树》

文章目录 一、二叉搜索树的概念二、二叉搜索树的实现2.1 插入迭代插入递归插入 2.2 查找迭代查找递归查找 2.3 删除迭代删除递归删除 2.4 中序遍历 三、二叉搜索树的应用1、K模型2、KV模型 四、二叉树的性能分析 一、二叉搜索树的概念 二叉搜索树又叫做二叉排序树。 左子树的…

diffusion model(三)—— classifier guided diffusion model

classifier guided diffusion model 背景 对于一般的DM&#xff08;如DDPM&#xff0c; DDIM&#xff09;的采样过程是直接从一个噪声分布&#xff0c;通过不断采样来生成图片。但这个方法生成的图片类别是随机的&#xff0c;如何生成特定类别的图片呢&#xff1f;这就是clas…

前沿重器[35] | 提示工程和提示构造技巧

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

MySQL数据库主从复制与读写分离(图文详解!)

目录 前言 一&#xff1a;MySQL数据库主从复制与读写分离 1、什么是读写分离&#xff1f; 2、为什么要读写分离呢&#xff1f; 3、什么时候要读写分离&#xff1f; 4、主从复制与读写分离 5、mysql支持的复制类型 &#xff08;1&#xff09;STATEMENT &#xff08;2&…

SLAM面试笔记(5) — C++面试题

目录 第1章 C基础 1 C中static静态变量有什么作用&#xff0c;在什么情况下会用&#xff1f; 2 类中的this指针指向哪里&#xff1f; 3 说一下const的作用。 4 std::string类型为啥不能memset&#xff1f; 5 emplace_back( )和push_back( )有什么区别&#xff1f; 6 tra…

【状态估计】基于无味卡尔曼滤波模拟倾斜传感器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

通过Redisson的管道批量操作来提高Redis Io效率

一、背景 当在对redis进行刷数操作时&#xff0c;大部分的redis框架对于单次执行的效率差不多&#xff0c;但我们有时需要一次性写入大量的redis key时&#xff0c;一次一次的操作速度就很慢。尤其是处于跨region的环境&#xff0c;一次的redis io就高达数十毫秒&#xff0…

Android aar包的生成与使用

前言 最近用Android Studio开发Android时&#xff0c;会经常接触到aar包&#xff08;Java Archive&#xff09;&#xff0c;aar包含所有资源&#xff0c;class以及res资源文件全部包含。 优势 Android通过aar方式把代码和资源打成一个包&#xff0c;提供给第三方使用或者是开…

什么是AOP?

目录 一、AOP简介 1、AOP简介和作用 2、AOP的概念 二、AOP的基本实现 三、AOP工作流程 1 、AOP工作流程 2、AOP核心概念 四、AOP切入点表达式 1、语法格式 2、通配符 五、AOP通知类型 1、AOP通知分类 2、AOP通知详解 &#xff08;1&#xff09;前置通知 &#xf…