C语言指针的几种用途

先看题目,写一个fun函数,统计一个字符串中某个字符出现的次数,以及这个字符第一次出现的位置。

看起来很简单,似乎几行就可以搞定,但是写出来之后,才发现代码怎么这么长!程序里多处使用了指针,涵盖了下面三种用途:

(1)动态申请内存,返回指针
(2)用指针访问数组中的元素
(3)指针作为函数形参,达到返回多个值的效果

题目面临的两个问题:
(1)输入的字符串长度未知
(2)fun函数需要返回2个值

#include <stdio.h>
#include <stdlib.h>void fun(const char* s, char c, int* count, int* first_pos);int main()
{int size = 10;char* s = (char*)malloc(size);		//①动态申请内存if (s == NULL){printf("memory alloc error\n");return -1;}int length = 0;char ch;while ((ch = getchar()) != '\n'){if (length >= size){size *= 2;s = (char*)realloc(s, size);if (s == NULL){printf("memory alloc error\n");return -1;}}*(s + length) = ch;		//②访问数组中的元素length++;}*(s + length) = '\0';printf("输入的字符串为:%s\n", s);int count = 0;int pos = -1;char c = 'a';fun(s, c, &count, &pos);printf("字符%c出现了%d次,第一次出现的位置是%d\n", c, count, pos);free(s);return 0;
}void fun(const char* s, char c, int* count, int* first_pos)	//③作为函数形参,达到返回多个值的效果
{int cnt = 0;int pos = -1;int i = 0;int found_flag = 0;while (*s != '\0'){if (*s == c){if (found_flag == 0){pos = i;found_flag = 1;}cnt++;}s++;i++;}*count = cnt;*first_pos = pos;
}

以上程序,多处用到了指针,指针的所有操作和内存息息相关。
(1)动态申请内存,返回指针
通过指针p获得对内存的控制权。
(2)用指针访问数组中的元素
数组本身是一个变量,而变量呢,它是内存中的一块区域,所以,通过指针访问数组中的元素,实际上就是通过指针获得了变量所在内存的控制权。由于数组元素在内存中是连续分布的,所以这个指针可以通过++或者--操作访问数组里的元素,这个指针它还描述了“位置信息”。
(3)指针作为函数形参,达到返回多个值的效果
count是一个指针,它指向了原来的实参,通过指针可以直接修改原来的实参,实际上,通过指针获得了实参所在内存的控制权。

c语言的指针,灵活,但是容易出错。
程序追求三个目标“简洁、高效、安全”,c程序的错误,除了逻辑错误之外,最多的就是内存错误,“高效”是c语言的优点,但是安全性……程序员一不小心就是崩溃。

下面用c++改写程序,看不到指针了,程序更加“简洁、安全”。
(1)string是不定长字符串类型,不用动态申请内存了。
(2)有了容器和迭代器,可以不再使用c的指针了。
(3)使用引用代替指针。

#include <iostream>
using namespace std;void fun(const string& s, char c, int& count, int& first_pos);int main()
{string s;cin >> s;cout << "输入的字符串为" << s << endl;int count = 0;int pos = -1;char c = 'a';fun(s, c, count, pos);cout << "字符" << c << "出现了" << count << "次,第一次出现的位置是" << pos << endl;return 0;
}void fun(const string& s, char c, int& count, int& first_pos)
{int cnt = 0;int pos = -1;int i = 0;int found_flag = 0;for (auto elem : s) {if (elem == c){if (found_flag == 0){pos = i;found_flag = 1;}cnt++;}i++;}count = cnt;first_pos = pos;
}

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

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

相关文章

Elasticsearch(ES) 简述请求操作索引下文档 增删查改操作

上文 Elasticsearch(ES) 创建带有分词器规则的索引 带着大家创建了一个带有分词功能的索引 老规矩 我们启动一下ES服务 本文 我们就来说说 关于文档的操作 我们先来添加一个文档 就像数据库加一条数据一样 这里 并不需要指定什么表结构和数据结构 它的文档结构是无模式的 添…

PyTorch 2.2 中文官方教程(十七)

&#xff08;Beta&#xff09;使用缩放点积注意力&#xff08;SDPA&#xff09;实现高性能 Transformer 原文&#xff1a;pytorch.org/tutorials/intermediate/scaled_dot_product_attention_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这…

从领域外到领域内:LLM在Text-to-SQL任务中的演进之路

导语 本文介绍了ODIS框架&#xff0c;这是一种新颖的Text-to-SQL方法&#xff0c;它结合了领域外示例和合成生成的领域内示例&#xff0c;以提升大型语言模型在In-context Learning中的性能。 标题&#xff1a;Selective Demonstrations for Cross-domain Text-to-SQL会议&am…

Jenkins任意文件读取漏洞(CVE-2024-23897)复现

Jenkins 有一个内置的命令行界面CLI&#xff0c;在处理 CLI 命令时Jenkins 使用args4j 库解析 Jenkins 控制器上的命令参数和选项。此命令解析器具有一个功能&#xff0c;可以将参数中后跟文件路径的字符替换为文件内容 ( expandAtFiles)。具有Overall/Read权限的攻击者可以读取…

成都爱尔林江院长解读儿童青少年为什么一定要进行医学验光配镜

根据国家卫健委数据显示&#xff1a;我国青少年儿童总体近视率为52.7%、高度近视人口超3000万。近视学生中,有10%为高度近视,且占比随年级升高而增长。 近视孩子之多&#xff0c;孩子视力发展备受关注。戴镜进行近视防控十分必要&#xff0c;且眼镜不可随意验配&#xff01; 成…

PAT-Apat甲级题1007(python和c++实现)

PTA | 1007 Maximum Subsequence Sum 1007 Maximum Subsequence Sum 作者 CHEN, Yue 单位 浙江大学 Given a sequence of K integers { N1​, N2​, ..., NK​ }. A continuous subsequence is defined to be { Ni​, Ni1​, ..., Nj​ } where 1≤i≤j≤K. The Maximum Su…

论文阅读-MapReduce

论文名称&#xff1a;MapReduce: Simplified Data Processing on Large Clusters 翻译的效果不是很好&#xff0c;有空再看一遍&#xff0c;参照一下别人翻译的。 MapReduce:Simplified Data Processing on Large Clusters 中文翻译版(转) - 阿洒 - 博客园 (cnblogs.com) 概…

仰暮计划|“如果你想看到世界上最完美的笑容,你就要多一点儿时间跟老人在一起,老人笑了,你就看到了。”

敬老从心开始&#xff0c;助老从我做起 时值假期&#xff0c;我们有了时间&#xff0c;决定好好践行孝亲敬老的传统美德。会计学院红心使者敬老院访问团在7月6日上午在河南省郑州市新郑市“华信老年公寓”进行实践活动。 一早来到敬老院&#xff0c;老人们都已经开始择菜&…

某赛通电子文档安全管理系统 PolicyAjax SQL注入漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

Redis核心技术与实战【学习笔记】 - 19.Pika:基于SSD实现大容量“Redis”

前言 随着业务数据的增加&#xff08;比如电商业务中&#xff0c;随着用户规模和商品数量的增加&#xff09;&#xff0c;就需要 Redis 能保存更多的数据。你可能会想到使用 Redis 切片集群&#xff0c;把数据分散保存到不同的实例上。但是这样做的话&#xff0c;如果要保存的…

【鸿蒙】大模型对话应用(三):跨Ability跳转页面

Demo介绍 本demo对接阿里云和百度的大模型API&#xff0c;实现一个简单的对话应用。 DecEco Studio版本&#xff1a;DevEco Studio 3.1.1 Release HarmonyOS SDK版本&#xff1a;API9 关键点&#xff1a;ArkTS、ArkUI、UIAbility、网络http请求、列表布局、层叠布局 页面跳…

excel统计分析——卡方适合性检验

参考资料&#xff1a;生物统计学 适合性检验是卡方检验应用的一种类型&#xff0c;检验实际的观测数与通过某一理论模型计算所得理论数是否相符&#xff0c;相当于1c列联表的卡方检验&#xff0c;也成为单因素离散型数据的卡方检验。 对参数的建设检验总是假定对照总体的分布数…

Linux 网络编程 + 笔记

协议&#xff1a;一组规则 分层模型结构&#xff1a; OSI七层模型&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层TCP/IP 4层模型&#xff1a;链路层/网络接口层、网络层、传输层、应用层 应用层&#xff1a;http、ftp、nfs、ssh、telnet、传输层&am…

C++ 动态规划 线性DP 数字三角形

给定一个如下图所示的数字三角形&#xff0c;从顶部出发&#xff0c;在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使路径上的数字的和最大。 73 8 8 1 02 7 4 4 4 5 2 6 5 输入格式 …

Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用

一、前言 之前在做倍速这个功能的时候&#xff0c;发现快速播放会有滴滴滴的破音出现&#xff0c;正常1倍速没有这个问题&#xff0c;尽管这个破音间隔很短&#xff0c;要放大音量才能听到&#xff0c;但是总归是不完美的&#xff0c;后面发现&#xff0c;通过修改qaudiooutpu…

Postman-接口测试教程

接口是软件开发中常用的概念&#xff0c;是软件生产过程中比较核心的任务。对于接口开发者&#xff0c;调试接口是一件较为繁琐的事情&#xff0c;很多时候需要线上线下来回切换。在这里&#xff0c;我就跟大家介绍一个只需要在本地就可以调试接口的方法&#xff0c;即使用post…

node.js与express.js创建项目以及连接数据库

搭建项目 一、技术准备 node版本&#xff1a;16.16.0 二、安装node成功后&#xff0c;安装express,命令如下&#xff1a; npm install -g express 或者&#xff1a; npm install --locationglobal express 再安装express的命令工具&#xff1a; npm install --location…

嵌入式学习第三篇——51单片机

目录 1&#xff0c;嵌入式系统 1&#xff0c;嵌入式系统的定义 2&#xff0c;单片机的定义 2&#xff0c;51单片机 1&#xff0c;开发环境 2&#xff0c;开发板使用的基本思路 1&#xff0c;查看原理图&#xff0c;查看芯片手册 2&#xff0c;获得调用硬件的管…

AI的安全应答之道

作者&#xff1a;统信UOS技术团队 2023,随着各种大语言模型的爆发&#xff0c;整个AI生态正处于从决策式AI进化到生成式AI的进程中。各类AI模型和AI应用层出不穷&#xff0c;也随之带来了与AI相关的各类潜在风险。AI开发和使用过程中的风险防范和治理&#xff0c;成为了不可忽…

SD-WAN的安全性体现在哪里?

SD-WAN技术以其高度灵活、网络自动配置和低成本等优势&#xff0c;将多个物理WAN链接整合为一个逻辑网络&#xff0c;推动网络从“连通驱动”向“服务驱动”导向的转变。同时&#xff0c;企业在追求高效网络时&#xff0c;SD-WAN的安全性也成为一个重要的考量因素。 SD-WAN采用…