当前位置: 首页 > news >正文

C语言指针plus版练习

        上期我们讲了进阶的指针,本期内容我们来强化一下上期学的内容

一、字符串左旋

       实现一个函数,可以左旋字符串中的k个字符。

        1.1 分析题目

        假设字符串为abcde,左旋一个以后就变成bcdea,就是把第一个字符移到一个新的变量里面,再把后一个字符移到前一个字符上,再把第一个字符放到最后一里就行啦

        1.2 解题代码

void left_move(char arr[], int sz, int n)
{while (n % sz){//将第一个元素存入tmpchar tmp = arr[0];int i = 0;//将后一个元素存入前一个for (i = 0; i < sz - 1; i++){arr[i] = arr[i + 1];}//将tmp存入最后一个元素arr[i] = tmp;n--;}
}int main()
{char arr[] = "abcdef";int n = 0;int sz = strlen(arr);scanf("%d", &n);left_move(arr,sz, n);printf("%s\n", arr);return 0;
}

        

        1.3 另解

        聪明的你一定发现了此题另有他法,太聪明了太聪明了!

        只要仔细观察,我们其实可以发现,左旋x个字符,就将前x个字符反过来,再将剩下的字符反过来,最后把全部的字符再反过来就可以得到

        

        所以代码也可以这样写

void left_move(char arr[],int sz, int n)
{//反转前n个rollback(arr, arr + n - 1);//反转剩下的rollback(arr + n , arr + sz - 1);//反转全部rollback(arr, arr + sz - 1);
}int main()
{char arr[] = "abcdef";int n = 0;int sz = strlen(arr);scanf("%d", &n);left_move(arr, sz, n % sz);printf("%s\n", arr);return 0;
}

二、指针和数组试题解析

        除了&数组名和sizeof(数组名),这两个情况表示整个数组,其他都是表示数组首元素地址

        2.1 一维整型数组

        我们一个一个来分析:

        1. sizeof( a ),这里的a表示整个数组,因此他的大小为——>16字节

        2. sizeof( a+0 ),这里的a不是单独放在数组里面的,所以这里的a表示数组首元素地址,a+0也是表示首元素地址,是地址就是4/8个字节

        3. sizeof( *a+0 ),*a表示数组的第一个元素+0以后也是整型的,所以这里是4个字节

        4. sizeof( a+1 ),a是数组首元素地址,a+1就是数组第二个元素的地址,是地址就是4/8个字节

        5. sizeof(a[ 1 ]), a[ 1 ] 等价于 *( a + 1),就是数组中第二个元素的大小,因为是int型,所以是4个字节

        6. sizeof( &a ), &a就是取出数组a的地址,是地址就是4/8个字节

        7. sizeof( *&a ), *&a就是先取出整个数组的地址,然后再解应用,所以和sizeof( a )是一样的,16个字节

        8. sizeof( &a + 1), &a + 1是跳过整个数组取出的地址,是地址就是4/8个字节

        9. sizeof( a[ 0 ]), a[ 0 ] 就是* ( a + 0),也就是数组中第一个元素的地址,是地址就是4/8个字节

        10. sizeof( a[ 0 ] + 1 ),  就是* ( a + 0 ) + 1,也就是数组中第二个元素的地址,是地址就是4/8个字节

        答案如下:

        2.2 一维字符数组

        2.2.1 char arr[] = {'a','b','c','d','e','f'};

        sizeof

        1. sizeof( arr ), 就是数组占用空间的大小,所以为6个字节

        2. sizeof( arr + 0 ),这里arr没有单独放在sizeof中,因此它表示数组中首元素的地址,是地址就是4/8个字节

        3. sizeof( *arr ), 同上,arr表示数组首元素地址,解引用之后就是数组首元素的大小,所以是1个字节

        4. sizeof( arr[ 1 ]), arr[ 1 ]等价于*(arr + 1),就是数组中第二个元素的大小,就是1个字节

        5. sizeof( &arr), &arr表示取出整个数组的地址,是地址就是4/8个字节

        6. sizeof( &arr + 1 ),&arr + 1表示跳过这个数组取出的地址,是地址就是4/8个字节

        7. sizeof( &arr[0] + 1), &arr[ 0 ] + 1,表示数组的第二个元素的地址,是地址就是4/8个字节

          答案如下:

        strlen

        1. strlen( arr ), 表示从数组首元素开始,直到‘\0’出现的字符个数,因此是个随机值

        2.strlen( arr + 0 ), 同上,随机值

        3. strlen( *arr ), 这里的意思为strlen( ‘a’ )就是strlen( 97 ),传给strlen是一个非法的地址,非法访问

        4.strlen( arr[ 1 ]), 同上,非法访问

        5. strlen( &arr ), &arr 虽然是数组的地址,但也是从数组的首元素开始找‘\0’的,所以也是随机值

        6. strlen( &arr + 1), 同上,跳过一整个数组开始找‘\0’ ,随机值

        7.  strlen( &arr[ 0 ] + 1), 同上,从第二个元素的地址开始找‘\0’, 随机值 

        答案如下:

        2.2.2 char arr[] = "abcdef";

        sizeof

        1. sizeof( arr ), 这里数组名单独放在sizeof里面,所以表示的为整个数组,大小就是7(末尾还有‘ \0 ’)

        2. sizeof( arr + 0 ), arr + 0表示首元素地址,是地址就是4/8个字节

        3. sizeof( *arr ), arr表示数组首元素,*arr就是首元素,所以就是1个字节

        4. sizeof( arr[ 1 ] ), arr[ 1 ]等价于 *(arr + 1),就是数组第二个元素,1个字节

        5. sizeof( &arr ), &arr表示取出一整个数组的大小,是数组就是4/8个字节 

        6. sizeof( &arr + 1), &arr + 1表示跳过一整个数组取出的地址,是地址就是4/8个字节

        7. sizeof( &arr[ 0 ] + 1), &arr[ 0 ] +1表示数组第二个元素的地址,是地址就是4/8个字节

        答案如下:

        strlen

        1. strlen( arr ), 这里的arr为数组首元素地址,从数组首元素开始找‘ \0 ’,所以为6

        2. strlen( arr + 0), 同上,为6

        3. strlen( *arr ), 意为strlen( ‘ a ’ ),就是strlen( 97 ), 非法访问

        4. strlen( arr[ 1 ]), 同上,非法访问     

        5. strlen( &arr ), arr虽然是数组的地址,但也是从首元素开始找‘ \0 ’,所以为6

        6. strlen( &arr + 1), 跳过整个数组开始找,随机值

        7. strlen( &arr[ 0 ] + 1), 跳过数组首元素开始找‘ \0 ’,所以为6   

        答案如下:

        2.2.3 指针型

        sizeof

        1. sizeof( p ), 这里指针p指向的是字符串的首个字符的地址,所以sizeof( p )就是第一个字符的地址的大小,是地址就是4/8个字节

        2. sizeof( p + 1 ), 就是指向第二个字符的地址的大小,是地址就是4/8个字节

        3. sizeof( *p ), 就是‘ a ’的大小,为1个字节

        4. sizeof( p[ 0 ]), p[ 0 ]就是*( p + 0 ),和上一个一样,大小为1个字节  

        5. sizeof( &p ), &p就是取出p的地址,是二级指针,是地址就是4/8个字节

        6. sizeof( &p +1 ), &p + 1,和上一个类似,跳过指针p取下一个地址,是地址就是4/8个字节

        7. sizeof( &p[ 0 ] + 1), &p[ 0 ]是‘ a ’的地址,+1就是‘ b ’的地址,是地址就是4/8个字节

        答案如下:

        strlen

        1. strlen( p ) ,就是从第一个字符‘ a  ’开始找‘ \0 ’,所以为6

        2. strlen( p + 1 ), 跳过‘ a ’,从‘ b ’ 开始找‘ \0 ’ ,所以为5

        3. strlen( *p ), 非法访问

        4. strlen( p[ 0 ]), p[ 0 ]和*( p + 0 )一样,所以也是非法访问  

        5.strlen( &p ), 从p的地址开始找‘ \0 ’ ,为随机值

        6. strlen( &p + 1 ), 跳过p的地址开始找‘ \0 ’,为随机值

        7. strlen( &p[ 0 ] + 1),  &p[ 0 ]为‘ a ’的地址,所以+1就是‘ b ’的地址,所以为5

        答案如下:

        2.3 二维数组

        上强度咯~

        1. sizeof( a ), 这里数组名a单独存放在sizeof中,因此表示整个数组,所以他的大小为48个字节

        2. sizeof( a[ 0 ][ 0 ] ), 为数组中第一个元素的大小,就是4个字节

        3. sizeof( a[ 0 ] ), 是第一行的数组名,单独放在sizeof中,为数组第一行的元素大小,就是16个字节

        4. sizeof( a[ 0 ] + 1 ), a[ 0 ]没有单独放在sizeof中,所以表示a[ 0 ]数组中的首元素地址,也就是a[ 0 ][ 0 ]的地址,+1就是a[ 0 ][ 1 ]的地址,是地址就是4/8个字节

        5.sizeof( *( a[ 0 ] + 1)), 表示a[ 0 ][ 1 ]的大小,就是4个字节

        6.sizeof( a + 1), a没有单独存放在sizeof中,所以这里表示数组a的首元素地址,就是数组a[ 0 ]的地址,是地址就是4/8个字节

        7. sizeof( *( a+ 1)), 就是数组a[ 0 ]的大小,就是16个字节

        8.sizeof( &a[ 0 ] + 1), &a[ 0 ]表示取出数组a[ 0 ]的地址,+1就是a[ 1 ]的地址,是地址就是4/8个字节

        9. sizeof( *( &a[ 0 ] + 1)),   就是数组a[ 1 ]的大小,就是16个字节

        10. sizeof( *a ), a没有单独存放在sizeof中,所以表示首元素地址,就是a[ 0 ],所以是16个字节

        11. sizeof( a[ 3 ] ), a[ 3 ]等价于*( a + 3),越界访问了,但是大小依然是16个字节

        答案如下:

三、指针笔试题

#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;
}
int main()
{char* a[] = { "work","at","alibaba" };char** pa = a;pa++;printf("%s\n", *pa);return 0;
}
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;
}

        上面代码结果是什么?

        答案评论666我私信给你

        给我三连的都是帅哥美女~

相关文章:

C语言指针plus版练习

上期我们讲了进阶的指针&#xff0c;本期内容我们来强化一下上期学的内容 一、字符串左旋 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 1.1 分析题目 假设字符串为abcde&#xff0c;左旋一个以后就变成bcdea&#xff0c;就是把第一个字符移到一个新的变量里面&#…...

Kafka 快速入门

目录 介绍 KafKa 相关术语 ​编辑 Kafka的工作流程 生产者向kafka发送数据的流程 Kafka选择分区的模式 Kafka选择分区的模式 数据消费 kafka的文件存储机制 topic、partition和segment 存储和查找message的过程 数据写入过程 数据查找过程 注意事项 kafka管理UI …...

探索人们最喜爱的AI工具及其应用影响

探索人们最喜爱的AI工具及其应用影响 在科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正在改变我们的生活和工作方式。越来越多的人开始使用AI工具来提高效率、简化流程和推动创新。那么&#xff0c;在众多的AI工具中&#xff0c;哪些是人们最喜欢的…...

c语言位域详解

一、什么是位域 位域是一种可以让结构体的成员变量以位为单位进行存储和操作的特性。位域允许我们精确控制数据的存储方式&#xff0c;而不像普通的整型变量那样固定使用系统规定的字节大小。 通过位域&#xff0c;我们可以在一个整型数据中指定具体的位数来表示某些信息。比…...

如何修改Spring Boot内置容器默认端口

默认情况下&#xff0c;Spring Boot 应用程序在嵌入式 Tomcat 服务器上启动&#xff0c;并监听默认端口 8080。如果您需要将默认的嵌入式服务器端口更改为其他端口号&#xff0c;可以使用以下几种方法之一&#xff1a; 嵌入式服务器配置命令行参数属性文件 在代码里以编程方式…...

STM32自动下载电路分享及注意事项

文章目录 简介ISP下载启动配置 USB转串口芯片CH340C手动isp下载自动isp下载RTS、DTR电平变化分析注意事项 简介 在嵌入式开发中&#xff0c;使用STM32下载程序&#xff0c;可以通过仿真器下载&#xff0c;也可以通过串口下载。在stm32串口下载时&#xff0c;我们需要手动配置启…...

【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。

【深度学习基础模型】极限学习机&#xff08;Extreme Learning Machines, ELM&#xff09;详细理解并附实现代码。 【深度学习基础模型】极限学习机&#xff08;Extreme Learning Machines, ELM&#xff09;详细理解并附实现代码。 文章目录 【深度学习基础模型】极限学习机&a…...

把交换机的两个接口连接起来会怎么样?

当把交换机的两个接口连接起来时&#xff0c;可能会产生网络风暴&#xff0c;具体情况如下&#xff1a; 一、形成环路的过程 如果将交换机的两个端口直接连接&#xff0c;就会在网络中形成一个物理环路。例如&#xff0c;假设交换机有端口 A 和端口 B&#xff0c;用一根网线将…...

无人机陆空双模式。

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…...

14. 文档对象模型

打开网页时&#xff0c;浏览器会检索网页的 HTML 文本并对其进行解析&#xff0c;就像第 12 章中的解析器解析程序一样。浏览器会建立一个文档结构模型&#xff0c;并使用该模型在屏幕上绘制页面。这种文档表示法是 JavaScript 程序在沙盒中的玩具之一。它是一种可以读取或修改…...

【计网】【计网】从零开始学习http协议 ---理解http重定向和请求方法

去光荣地受伤&#xff0c; 去勇敢地痊愈自己。 --- 简嫃 《水问》--- 从零开始学习http协议 1 知识回顾2 认识网络重定向3 http请求方法3.1 http常见请求方法3.2 postman工具进行请求3.3 处理GET和POST参数 1 知识回顾 前面两篇文章中我们学习并实现了http协议下的请求与应…...

yolov8/9/10/11模型在中医舌苔分类识别中的应用【代码+数据集+python环境+GUI系统】

yolov8、9、10、11模型在中医舌苔分类识别中的应用【代码数据集python环境GUI系统】 背景意义 目前随着人们生活水平的不断提高&#xff0c;对于中医主张的理念越来越认可&#xff0c;对中医的需求也越来越多。 传统中医的舌诊主要依赖于医生的肉眼观察&#xff0c;仅仅通过这…...

k8s部署安装

k8s部署安装 一 K8s集群环境搭建1.1 k8s中容器的管理方式1.2 k8s集群部署1.2.1 k8s环境部署说明1.2.2 k8s集群环境初始化1.2.2.1 所有节点禁用swap和本地解析1.2.2.2 所有节点安装docker1.2.2.3.所有节点设定docker的资源管理模式为systemd1.2.2.4.所有阶段复制harbor仓库中的证…...

gpt为什么可以依据上下文来回答问题,依据的是什么原理

GPT 可以依据上下文回答问题&#xff0c;主要依据以下几个原理&#xff1a; Transformer 架构&#xff1a; 并行计算与长距离依赖处理&#xff1a;Transformer 架构摒弃了传统的递归神经网络和长短时记忆网络的序列依赖处理方式&#xff0c;具有并行计算的能力。它可以同时处理…...

2023 CCPC哈尔滨 报告

比赛链接&#xff1a;Dashboard - 10.6组队训练赛-2023CCPC哈尔滨站 - Codeforceshttps://codeforces.com/group/w6iGs8kreW/contest/552949 做题数&#xff1a;3 题 三题都是队友写的。所以来补一下 B L J。 B题&#xff1a; B. Memory Little G used to be a participant …...

基于深度学习的手术中的增强现实导航

基于深度学习的手术中的增强现实&#xff08;AR&#xff09;导航技术是一种结合了先进的计算机视觉算法、深度学习模型与增强现实技术的创新应用。其主要目的是为外科手术提供实时的、精确的手术指导&#xff0c;帮助医生在复杂的手术过程中更好地理解患者的解剖结构&#xff0…...

输电线路缺陷图像检测数据集,导线散股,塔材锈蚀两类,分别为581张和1407张,标注为xml和txt格式 1988张

输电线路缺陷图像检测数据集&#xff0c;分为导线散股&#xff0c;塔材锈蚀两类&#xff0c;分别为581张和1407张&#xff0c;标注为xml和txt格式 数据集名称 输电线路缺陷图像检测数据集 (Transmission Line Defect Detection Dataset) 数据集概述 该数据集是一个专门用于训…...

百度飞桨(paddlepaddle)安装

百度飞桨&#xff08;paddlepaddle&#xff09;安装 Anaconda升级 打开 Anaconda Prompt &#xff08;或者 Mac 下的终端&#xff09;&#xff0c;键入&#xff1a; conda upgrade --all pip 安装 python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/s…...

≌图概念凸显有长度不同的射线

黄小宁 【摘要】自有射线概念后的2300年里一直无人能知有长度不同的射线、无人能知有互不≌的射线&#xff0c;从而使数学一直有几何“常识”&#xff1a;任何射线都没有长度差别。保距变换和≌图概念使人能一下子看到有长度不同的射线。 变量x所取各数也均由x代表&#xff0c…...

解决Nginx出现“Too many open files”的问题

解决Nginx出现“Too many open files”的问题 在那个不经意的瞬间&#xff0c;我感到一阵莫名的恍惚。同事突然提出要看我的手机&#xff0c;她的目光落在了我那泛黄的手机壳上。出乎意料地&#xff0c;她开始细心地擦拭&#xff0c;从内到外&#xff0c;动作轻柔而专注。那一刻…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...