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

小樽C++ 多章⑧ (叁) 指针与字符串、(肆) 函数与指针

目录

叁、函数与字符串

肆、函数与指针

4.1 指针作为函数参数

4.2 函数返回指针

4.3 函数指针与函数指针数组

4.4 结构体指针 


​​​​​​​​​​​​​​小樽C++ 多章⑧ (壹) 指针变量icon-default.png?t=N176https://blog.csdn.net/weixin_44775255/article/details/129031168

小樽C++ 多章⑧ (贰) 指针与数组icon-default.png?t=N176https://blog.csdn.net/weixin_44775255/article/details/129396791

叁、函数与字符串

说道字符串,我们要导入字符串库#include<cstring>

学会字符串的常用方法。strcpy,strcmp,strstr,strlen。

//字符串 
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[100],b[100]; 
int main(){strcpy(a,"hello");
//	cout<<a<<endl;printf("%s,len=%d\n",a,strlen(a)); //字符串长度 scanf("%s",b);int cmp = strcmp(a,b); //字符串比较大小 if(cmp==0){printf("%s=%s\n",a,b);}else if(cmp<0){printf("%s<%s\n",a,b);}else{printf("%s>%s\n",a,b);}if(strstr(a,b)!= NULL){ 	//查找子串 printf("%s in %s\n",b,a); }return 0;
} 

难点:具体来看看strcpy、strlen的来历

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char *strcpy(char *dest,const char *scr){char *p=dest;while(*scr != '\0'){*dest = *scr;dest++;scr++;}*dest = '\0';return p;
} 
int main(){char *a=new char;*strcpy(a,"cvbnm");cout<<a<<endl;*strcpy(a,"asd");cout<<a;return 0;
} 

strcpy 是 赋值的含义,把某个已知的字符串值赋值到a变量,输出a变量就有值了。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
size_t strlen(const char *str){const char *cp = str;while (*cp++){;}return (cp-str-1);
}
int main(){cout<<strlen("abcdr")<<endl;
}

 

 这些函数的实现都是指针操作!虽然也可以用数组来实现,但数组的存储效率会低一些。


肆、函数与指针

4.1 指针作为函数参数

自定义函数的参数可以有整型、浮点型,那可不可以用指针类型?

那来试试用指针参数实现交换两个变量的值。

例子1.交换两个值,再比比大小。

#include<iostream>
#include<cstdio> 
using namespace std;
void swap(int *x,int *y){ //交换两个值 int t = *x;*x = *y;*y = t;
}
void sort(int *x,int *y,int *z){ if(*x > *y) swap(x,y); //比大小 if(*x > *z) swap(x,z);if(*y > *z) swap(y,z);
} 
int main(){int a,b,c;scanf("%d%d%d",&a,&b,&c);sort(&a,&b,&c);printf("a=%d,b=%d,c=%d",a,b,c);return 0;
}


4.2 函数返回指针

用指针作为函数, 例如:int *a(int a,int b)。

炼1.实现一个包含n个整数的数组中找到第一个质数,若有则返回函数的地址,没则返回NULL。

#include<iostream>
#include<cstdio> 
#include<cmath>
using namespace std;
int n,a[1000];
bool isprime(int n){//求质数 if (n<2) return false;if(n==2) return true;for(int i=2;i<=sqrt(n);i++){if(n%i==0){return false;}}	return true;
} int *find(){ //指针查找函数 for(int i=1;i<=n;i++){if(isprime(a[i])){return &a[i];}}return NULL;
}
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}int *p = find();if(p != NULL){cout<<p<<" "<<*p;}return 0;
}


4.3 函数指针与函数指针数组

(1) 一般定义函数: int test(int );  那换成指针函数 int (*test)( int ); 

注意不可以写成: int *test ( int ); 这样子编程会 声明定义成 test ( int )的函数,返回类型是 int * 。

(2) 获取函数的地址。 跟数组一样,函数名就是地址,函数名也可看成是指针。

1.用 typedef 声明函数指针类型

#include<iostream>
#include<cstdio> 
using namespace std;
//函数指针 
int sum(int a,int b){return a+b;
} 
typedef int (*LP)(int,int); 
//定义声明了LP类型的函数指针,内有2个参数。
int main(){LP p = sum; // 定义LP类型的指针p cout<<p(2,5); //函数指针p调用参数return 0;
}

  

 2.模拟菜单功能实现例子,函数指针数组

//函数指针数组 
void t1(){	cout<<"test1"<<endl; } 
void t2(){	cout<<"test2"<<endl; } 
void t3(){	cout<<"test3"<<endl; } 
void t4(){	cout<<"test4"<<endl; } 
typedef void(*Tp)();
定义声明了空类型的函数指针 Tp,无参数。
int main(){Tp a[] = {t1,t2,t3,t4}; 定义TP类型的函数指针数组a int x;cin>>x;a[x](); return 0;
}


4.4 结构体指针 

  1. 定义一个结构体,有名字、性别、成绩成员。
  2. 声明结构体并赋值,还声明结构体指针;
#include<iostream>
#include<cstdio> 
using namespace std;
struct Student{char name[20];char sex;float score;
};Student *p;
Student stu={"lisi",'m',95.5};
  1. 3.指针访问结构体成员方法:
  • (*指针名).成员名  (*p).name
  • 指针名->成员名  p->name
int main(){cout<<stu.name<<endl;p = &stu; //指针指向stu地址 cout<<(*p).name<<endl;
//	(*p).name 效果等同 stu.namecout<<(*p).sex<<endl;cout<<p->score; 
//	p->score 效果等同(*p).scorereturn 0;
} 

 由于一般引用结构体变量,通常要对整个的结构体进行引用,效率不高;所以一般用指针会提高写效率。

相关文章:

小樽C++ 多章⑧ (叁) 指针与字符串、(肆) 函数与指针

目录 叁、函数与字符串 肆、函数与指针 4.1 指针作为函数参数 4.2 函数返回指针 4.3 函数指针与函数指针数组 4.4 结构体指针 ​​​​​​​​​​​​​​小樽C 多章⑧ (壹) 指针变量https://blog.csdn.net/weixin_44775255/article/details/129031168 小樽C 多章⑧ …...

Mybatis-Plus

新建个项目 引入lombok devtools web mysql驱动 pom.xml引入mybatis-plus依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency> sp…...

yolov8行人识别教程(2023年毕业设计+源码)

yolov8识别视频直接上YOLOv8的结构图吧&#xff0c;小伙伴们可以直接和YOLOv5进行对比&#xff0c;看看能找到或者猜到有什么不同的地方&#xff1f; Backbone&#xff1a;使用的依旧是CSP的思想&#xff0c;不过YOLOv5中的C3模块被替换成了C2f模块&#xff0c;实现了进一步的轻…...

CAD指令框找不到了怎么调出来?CAD指令框调出方法

CAD制图过程中&#xff0c;为了提高设计师的绘图效率&#xff0c;经常会用到各种CAD命令快捷键&#xff0c;可是CAD指令框突然不见了&#xff0c;这就让人很头疼了。CAD指令框找不到了怎么调出来呢&#xff1f;本节内容小编以浩辰CAD软件为例来给大家分享一下CAD指令框调出方法…...

一般用哪些工具做大数据可视化分析?

做数据分析这些年来&#xff0c;从刚开始的死磕excel&#xff0c;到现在成为数据分析行业的偷懒大户&#xff0c;使用过的工具还真不少&#xff01; 这篇分享一些我在可视化工具上的使用心得&#xff0c;由简单到复杂&#xff0c;按照可视化类型一共分为纯统计图表类、GIS地图…...

Python每日一练(20230308)

目录 1. Excel表列名称 ★ 2. 同构字符串 ★★ 3. 分割回文串 II ★★★ &#x1f31f; 每日一练刷题专栏 C/C 每日一练 ​专栏 Python 每日一练 专栏 1. Excel表列名称 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1…...

jvm之堆解读

堆&#xff08;Heap&#xff09;的核心概述 堆针对一个JVM进程来说是唯一的&#xff0c;也就是一个进程只有一个JVM&#xff0c;但是进程包含多个线程&#xff0c;他们是共享同一堆空间的。 一个JVM实例只存在一个堆内存&#xff0c;堆也是Java内存管理的核心区域。 Java堆区…...

重构·改善既有代码的设计.02

前言之前在《重构改善既有代码的设计.01》中初步了解了重构的基本前提&#xff0c;基础原则等入门知识。今天我们继续第二更......识别代码的坏味道Duplicated Code 重复代码。最单纯的Duplicated Code就是“同一个类中含有相同的表达式”或“两个互为兄弟的子类内含有相同表达…...

脑电信号处理总成

目录一. EEG(脑电图)1.1 脑波1.2 伪迹1.2.1 眼动伪迹1.2.2 肌电伪迹1.2.3 运动伪迹1.2.4 心电伪迹1.2.5 血管波伪迹1.2.6 50Hz和静电干扰1.3 伪迹去除方法1.3.1 避免伪迹产生法1.3.2 直接移除法1.3.3 伪迹消除法一. EEG(脑电图) 1.1 脑波 脑波&#xff08;英语&#xff1a;br…...

判断推理之图形推理

考点一动态位置变化&#xff08;一&#xff09;平移1.特征&#xff1a;图形在平面上的移动&#xff0c;图形本身的大小和形状不发生改变。2.方向&#xff1a;直线&#xff08;上下、左右、斜对角线&#xff09;&#xff0c;绕圈&#xff08;顺时针、逆时针&#xff09;3.距离&a…...

【预告】ORACLE Unifier v22.12 虚拟机发布

引言 离ORACLE Primavera Unifier 最新系统 v22.12已过去了3个多月&#xff0c;应盆友需要&#xff0c;也为方便大家体验&#xff0c;我近日将构建最新的Unifier的虚拟环境&#xff0c;届时将分享给大家&#xff0c;最终可通过VMWare vsphere (esxi) / workstation 或Oracle …...

Sql执行流程与Redo log、 Undo log、 Bin log日志文件

文章目录Sql执行流程与日志文件Sql的执行流程Redo LogBin logUndo logSql执行流程与日志文件 Sql的执行流程 mysql的内部组件结构如下图所示 连接器 与客户端建立连接&#xff0c;检验登录密码&#xff0c;分配相应权限 查询缓存 执行sql语句时会先从这里找一下&#xff0c;…...

如何提高软件测试执行力

高效的测试执行力 不管在哪个行业&#xff0c;高校的执行力都是不可或缺的。在软件测试行业更是这样。有些测试人员&#xff0c;很勤奋也很吃苦&#xff0c;但是可能最终不能很好的完成测试任务。究其原因就是一个测试执行力的问题。 高效执行就是有目标&#xff0c;有计划&…...

Open3D 计算点到平面的距离

目录 一、算法原理二、代码实现三、结果展示一、算法原理 平面外一点 ( x 1 , y 1 , z 1 ) (x_1,y_1,z_1) (x...

DDD领域驱动设计初探

DDD 强调领域模型要兼顾业务和技术两个视角。 我们怎么用一套系统化的方法&#xff0c;抽丝剥茧、一步一步地把需求落实到代码呢&#xff1f;咱们看看下面这张图&#xff0c;它表示了领域驱动设计中的主要流程。 领域驱动设计主要的开发流程你可以看到&#xff0c;在整个开发流…...

C中AES_cbc_encrypt加密对应java中的解密

前言知识&#xff1a; 1.AES&#xff08;Advanced Encryption Standard&#xff09;高级加密标准&#xff0c;作为分组密码&#xff08;把明文分成一组一组的&#xff0c;每组长度相等&#xff0c;每次加密一组数据&#xff0c;直到加密完整个明文&#xff09;。 2.在AES标准…...

演化算法:乌鸦搜索算法 (Crow Search Algorithm)

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 在机器学习中&#xff0c;我们所要优化的问题很多时候难以求导&#xff0c;因此通常会采用一些演化算法&#xff08;又称零…...

基于open62541的OPC UA服务器和客户端开发技术

一、OPC UA的基本概念 1、OPC(OLE for Process Control),是一个工业标准,管理这个标准的国际组织是OPC基金会; 2、OPC通信结构:是指包含一个或多个OPC客户端与服务器相互通信的集合。以下是一个简单的流程图:标准的C/S结构。 3、OPC服务器:TOPC基金会定义了四种;...

测试测开面试要知道的那些事01

列表与元组的区别列表是动态数组&#xff0c;它们可变且可以重设长度&#xff08;改变其内部元素的个数&#xff09;。元组是静态数组&#xff0c;它们不可变&#xff0c;且其内部数据一旦创建便无法改变。元组缓存于Python运行时环境&#xff0c;这意味着我们每次使用元组时无…...

物联网毕设 -- 智能厨房监测系统(改)

前言 在家庭生活中&#xff0c;厨房是必不可少的&#xff0c;所以厨房的安全问题关乎着我们大家的生命&#xff0c;所以提出智能厨房监测系统&#xff0c;目的就是为我们减少不必要的安全问题 ⚠️⚠️&#xff08;本文章仅提供思路和实现方法&#xff0c;并不包含代码&#x…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...