C语言学习(二十五)---指针练习题(一)

news2024/9/20 6:27:23

在上一节内容中,我们学习了递归冒泡排序法的有关内容,今天我们将继续往下学习,主要内容为指针练习题,好了,话不多说,开整!!!

在之前的第18—22的内容中,我们学习了指针的一系列内容,今天我们对之前的指针内容进行测试,在查看答案之前,请先自己分析,

不要直接复制代码,然后运行得到结果

因为只有分析了你才知道自己是否是真的掌握了相关内容,下面开始。

一维数组指针题目

分析以下代码的结果:

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

我们知道sieof是求一个数据的所占用的内存空间的函数,其单位为字节

你分析好了吗,分析好了就可以往下看喽,分析如下:

#include<stdio.h>
#include<string.h>
int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n",sizeof(a+0)); //数组名默认首元素地址:加0还是首元素地址,地址为一个指针,因此结果为4字节(32位)
    printf("%d\n",sizeof(*a));//数组名默认首元素地址,解引用也就是数组中的1,其为整型数据,所以为4字节(32位)
    printf("%d\n",sizeof(a+1));//数组名默认首元素地址:加1是数组中第二个元素2的地址,地址4字节
    printf("%d\n",sizeof(a[1]));//数组中第一个元素1的大小,其为整型所以为4字节
    printf("%d\n",sizeof(&a));//&a:为整个数组的地址,既然为地址,就占4个字节(32位)
    printf("%d\n",sizeof(*&a));//对整个数组进行解引用,因此大小为4*4=16字节
    printf("%d\n",sizeof(&a+1));//整个数组的下一位元素的大小:4字节
    printf("%d\n",sizeof(*&a[0]));//取出第一个元素的地址并解引用,整型数据1,4字节
    printf("%d\n",sizeof(*&a[0]+1));//取出第一个元素的地址并解引用,整型数据1,再加1为2,整型2的大小为4字节
    return 0;
}

我们编译查看结果,看看是否分析正确呢

在这里插入图片描述
从结果中,我们可以看到我们分析是正确的。

字符数组的指针题目

下面进行分析字符数组的相关题目,分为sizeofstrlen题目两个方面的题目。

sizeof题目

首先我们使用sizeof函数,计算字符数组的大小,代码如下:

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

同样,在分析之后再查看以下的分析过程:

#include<stdio.h>
int main()
{
    char a[] = {'a','b','v','c','t'};
    printf("%d\n",sizeof(a)); //数组名放入sizeof内,其代表整个数组,每个字符占一个字节,因此,一共5个字节
    printf("%d\n",sizeof(a+0));//此时a不再代表整个数组,而是数组首元素的地址,加0 还是首元素地址,地址即为4字节(32位)
    printf("%d\n",sizeof(*a));//数组名代表首元素地址,也引用即为字符a,其大小为1字节
    printf("%d\n",sizeof(a+1));//数组名代表首元素地址,加1代表字符b的地址,地址即为4字节(32位)
    printf("%d\n",sizeof(a[1]));//此时表示数组中字符b的大小,1字节
    printf("%d\n",sizeof(&a));//&a代表整个数组的地址,地址即为4字节(32位)
    printf("%d\n",sizeof(*&a));//&a代表整个数组的地址,整个数组解引用即5个字节
    printf("%d\n",sizeof(&a+1));//&a代表整个数组的地址,加1代表此数组后的下一个元素的地址,地址即为4字节(32位)
    printf("%d\n",sizeof(*&a[0]));//取出数组中字符a的地址并解引用,也就是字符a,1字节
    printf("%d\n",sizeof(&a[0]+1));//取出数组中字符a的地址,加1表示字符b的地址,地址即为4字节(32位)
    return 0;
}

我们查看结果:
在这里插入图片描述
和我们分析的结果一致,因此我们的分析是正确的。

strlen题目

strlen是用来求字符串长度的函数,其统计字符串结束标志'\0'前的字符个数,下面请分析以下代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char a[] = {'a','b','v','c','t','r'};
    printf("%d\n",strlen(a));
    printf("%d\n",strlen(a+0));
    printf("%d\n",strlen(*a));
    printf("%d\n",strlen(a+1));
    printf("%d\n",strlen(a[1]));
    printf("%d\n",strlen(&a));
    printf("%d\n",strlen(&a+1));
    printf("%d\n",strlen(&a[0]+1));
    return 0;
}

自己分析完成后,再看以下的分析:

#include<stdio.h>
#include<string.h>
int main()
{
    char a[] = {'a','b','v','c','t','r'};
    printf("%d\n",strlen(a)); //由于上述这种字符串定义方式并不会自动补充字符串结束标志'\0'
    //因此,其将会直至找到\0位置,所以将打印一个随机值
    printf("%d\n",strlen(a+0));//数组名默认为书元素地址,加0仍然是首元素地址,然后去找\0,仍是一个随机值
    // printf("%d\n",strlen(*a));//对首元素地址解引用,则是字符a,因此将会其对应的ASCII码值的地址开始寻找\0,会产生错误
    printf("%d\n",strlen(a+1));//首元素地址加1,则变为了字符数组中字符b的地址,因此将从b开始寻找结束标志\0,也是一个随机值
    //但该随机值将等前两个随机值-1
    // printf("%d\n",strlen(a[1]));访问数组中的第二个元素,则是字符b,因此将会其对应的ASCII码值的地址开始寻找\0,会产生错误
    printf("%d\n",strlen(&a));//&a代表整个数组的地址,从此地址开始找\0,也是一个随机值,和前两个随机值相同
    printf("%d\n",strlen(&a+1));//从整个数组后的下一个字节开始寻找\0,随机值,但不等于前几个随机值
    printf("%d\n",strlen(&a[0]+1));//&a[0]取出第一个元素的地址,再加1为第二个元素的地址,从此开始寻找\0,其值也为随机值
    //数值和前两个随机值再减一相同
    return 0;
}

如果我们不注释掉其中的两行程序将会中断,如下所示:
在这里插入图片描述
Linux下,我们可以更清楚的看到其发生了错误,如下:
在这里插入图片描述

注释后,程序正常运行,如下图所示:
在这里插入图片描述
发现和我们分析的对上了,因此分析无误。
Ps:
前两天有些事情,因此没有按时更新,以后还是会尽量按时更新,最后

祝大家端午节快乐!!!

上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

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

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

相关文章

lnmp框架的应用

目录 应用一 nginx访问状态统计 1.先查看http_stub_status有没有安装 2.进入nginx的配置文件改配置 3.nginx-检查配置 重启服务 最后这个20就是显示的状态统计 应用二 给网站加密 1.首先安装http-tools软软件 2.把nginx设置锁也要有执行权限 3.进入nginx配置文件 4. 检查…

【Windows个性化设置篇】StartAllBack更改win11任务栏设置

【Windows个性化设置篇】StartAllBack更改win11任务栏设置 Windows11目前不支持更改任务栏位置固定的修改&#xff0c;因为想把任务栏固定到旁边&#xff0c;从而充分利用电脑屏幕位置。之前试过TranslucentTB可以把任务栏透明化&#xff0c;很漂亮&#xff0c;但在分屏操作时…

【Vue3】Vue3+Vite+TS使用npm包引入百度地图

文章目录 Vue3ViteTS引入百度地图一、注册二、安装依赖包三、参考文档四、全局注册五、局部导入六、断网地图的使用八、项目使用成功图片九、使用卫星图 Vue3ViteTS引入高德地图npm包查找地图依赖包 Vue3ViteTS引入百度地图 一、注册 官网&#x1f449;百度地图开放平台 注册…

python---案例分析(1)

标准库 python自带的 第三方库 其他人做出来的 例1: 实现一个日期计算器 EG: 计算2012年2月14日和2016年2月3日之间的差值 使用datetime 1.根据日期构造出datetime类型的变量 2.把两个变量进行相减,得到的结果即为所求 1) 2) 3) 例2: 实现单词逆序 翻转单词顺序 i am a s…

MySQL数据库表的操作

创建表 语法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 说明&#xff1a; field 表示列名。 datatype 表示列的类型。 character set 字符集&#xff0c;如果没有指…

hutool包下的BeanUtil工具使用、SQL中的and和OR的优先级

SQL中的and和OR的优先级 首先and的优先级大于or&#xff0c;通俗理解其实or查询其实会把条件分为左右两边来查。 如select * from user where id 1 and status 2 or status 3,本来想查询user表中id为1的状态为2或者3的数据&#xff0c;其实只会这样执行&#xff0c;and比or…

大数据分析案例-基于LightGBM算法构建航空公司满意度预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

DOD Digital Engineering Vision 数字工程策略与实施

DOD Digital Engineering Vision DOD的数字工程策略与实施&#xff0c;仅供个人学习使用&#xff0c;不代表个人意见和观点&#xff01;&#xff01;&#xff01; Digital Engineering Strategy and Implementation Ms. Philomena Zimmerman Office of the Under Secretary …

day1

在linux内核中&#xff0c;当用户打开设备文件时&#xff0c;内核中的VFS层会调用设备驱动中的sys_open()函数&#xff0c;在sys_open()函数中&#xff0c;内核会根据文件的inode号判断文件是否存在于文件系统中&#xff0c;如果存在&#xff0c;内核会找到这个文件的文件信息结…

Python:使用钉钉dingtalk发送通知消息

通过钉钉的开放API接口&#xff0c;可以很容易的将消息发送到钉钉dingtalk&#xff0c;比起邮件发送更稳定&#xff0c;及时 文档 官网&#xff1a;https://www.dingtalk.com/API Explorer调试 https://open-dev.dingtalk.com/apiExplorer 目录 方式一&#xff1a;webhook方式…

Search space set group switching(一)

欢迎关注同名微信公众号“modem协议笔记”。 根据R17 38.300的描述&#xff0c;UE可以通过PDCCH monitoring adaptation机制实现power saving的目的&#xff0c;这其中就包括PDCCH monitoring skipping和search space set group (SSSG) switching两种机制。PDCCH monitoring s…

dom4j 解析 mybatis mapper xml 文件

01: CarMapper.xml : <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"car"…

代码随想录 回溯算法 Java

文章目录 组合&#xff08;*中等&#xff09;77. 组合&#xff08;*中等&#xff09;17. 电话号码的字母组合&#xff08;中等&#xff09;39. 组合总和&#xff08;中等&#xff09;40. 组合总和II&#xff08;中等&#xff09;216. 组合总和||| 分割&#xff08;*中等&#x…

【王道操作系统】内存管理

内存管理概念 1.C 2.D 存储保护的作用&#xff1a;保证各道作业在各自的存储空间内运行&#xff0c;互不干扰 实现虚拟内存管理需要请求分页&#xff08;请求分段、请求段页&#xff09;等技术的支持&#xff0c;故需要硬件支持&#xff0c;比如页表机制、中断机构、地址变换…

【五子棋实战】第1章 项目架构与开发思路

【五子棋实战】第1章 项目总览 前言 ## 项目技术栈 ## 项目可配置性 博客目录 项目预览 项目代码获取 项目架构 ## 架构&#xff1a;前端页面 算法接口 ## 前端页面 ## 算法接口 开发思路 前言 五子棋是一种古老而受欢迎的棋类游戏&#xff0c;本博客将介绍如何使用…

Matplotlib-直方图、箱型图

1. 直方图 hist函数来创建一个直方图。下面是对各个参数的解释&#xff1a; x&#xff1a;要绘制直方图的数据序列。bins&#xff1a;指定直方图的边界范围和间隔。这里使用range(40, 110, 6)表示边界从40到110&#xff0c;间隔为6。facecolor&#xff1a;直方图的填充颜色。…

unity UGUI源码分析(4)Text与TextMeshPro

这一篇博客用于分析Text的内容的更新机制&#xff0c;并分析text mesh pro。 首先我们分析Text的文字是如何渲染出来的。 PupulateWithErrors方法会根据字符串生成顶点数据。其实Text会根据所给定的字符串生成相关的图集&#xff0c;然后对图集进行采样就可以渲染出文字了。由…

【五子棋实战】第3章 算法包装成第三方接口

【五子棋实战】第3章 算法包装成第三方接口 使用Flask开放接口 ## 定义接口输入 ## 开放接口、跨域配置、数据解析 数据预处理 ## 数据检查与异常捕获 ## 预处理数据 ## 定义接口输出 开启接口 继续学习下一篇实战&#xff01; 我们在上一章实现了博弈树负值极大alpha…

最适合入门的100个深度学习实战项目

&#x1f6a8;注意&#x1f6a8;&#xff1a;最近经粉丝反馈&#xff0c;发现有些订阅者将此专栏内容进行二次售卖&#xff0c;特在此声明&#xff0c;本专栏内容仅供学习&#xff0c;不得以任何方式进行售卖&#xff0c;未经作者许可不得对本专栏内容行使发表权、署名权、修改…

Linux系统安装nginx+入门笔记

安装过程 1.加载wget命令 yum install wget 2.拉取安装包 wget https://nginx.org/download/nginx-1.16.1.tar.gz 3.解压安装包 tar -zxvf nginx-1.16.1.tar.gz 4.执行这个命令自动配置一下 5.编译安装 make make install 6.查看nginx安装的位置 whereis nginx 7.…