Linux学习--C语言(指针3)

1.指针函数和函数指针

1.1 指针函数

指针函数是函数,函数的返回值是指针

  • 不能返回局部变量的地址
  • 指针函数返回的地址可以作为下一个函数调用的参数

 1.2 函数指针

函数指针是指针,指针指向一个函数

#include <stdio.h>int Add(int x, int y)
{return x + y;
}int Sub(int x, int y)
{return x - y;
}int Mul(int x, int y)
{return x * y;
}int Div(int x, int y)
{return x / y;
}int jisuanqi(int x, int y, int (*p)(int x, int y))
{return p(x,y);
}int main(void)
{int (*p)(int x, int y) = NULL;int num1 = 0;int num2 = 0;char op = 0;scanf("%d %c%d",&num1,&op,&num2);switch(op){case '+':p = Add;break;case '-':p = Sub;break;case '*':p = Mul;break;case '/':p = Div;break;}printf("Ret = %d\n",jisuanqi(num1, num2, p));    //p指向某函数return 0;
}

2.二级指针

2.1 定义

二级指针是指向一级指针变量的指针

int **q;定义一个指针变量q,占8个字节空间,指向ige指针变量空间,即指向一级指针变量的指针

2.2 使用场景

1.函数体内部想修改函数体外部指针变量的值时,需要传递指针变量的地址即二级指针

2.指针数组传参,数组的数组名是指向数组第一个元素的指针,第一个元素是指针,所以数组名为指向指针的指针即二级指针

3.指针数组和数组指针

3.1 定义

1.指针数组:是数组,数组的每个元素是指针

2.数组指针:是指针,指针指向整个数组

int *a[5];
定义一个数组,占40个字节空间,数组名为a,每个元素都是int *型的指针int (*a)[5];
定义一个指针,占8个字节,指针变量名为a,是指向数组为20个字节空间的指针

3.2 指针数组

int *a[5];
char *pstr[5];
  • 存放字符串使用字符型数组,操作字符串使用指针
  • 存放字符串数组使用字符型二维数组,操作字符串数组使用指针数组

3.3 利用指针数组操作二维数组中的字符串实现排序

  • 二维数组存放字符串数组
  • 指针数组元素变化代替二维数组字符串变化,提高程序效率

 

3.4 数组指针

  • 对一维数组数组名&:值不变 ,类型升级为指向整个数组的指针
  • 对指针数组*:值不变,类型降级为指向数组第一个元素的指针
int a[5] = {1,2,3,4,5};a == &a[0];a == int *

注意:两种情况a不能理解为int *

  • sizeof:获得数据类型、变量所占字节
  • &:&int * -> int **   &a -> int (*p)[5]

 第十一行:&a+1指向下一个数组的首地址,再强制转换为int *型,再减一即减去四个字节,回到数组a的第五个元素,故打印出来为5

 3.5 数组指针的使用场景

 1.一维数组和指针的关系

  • 数组的数组名是指向数组第一个元素的指针常量
int a[5] = {1,2,3,4,5};
int *p = NULL;p = &a[0];
p = a;a == &a[0];a[n] == *(a+n) == *(p+n) == p[n]

2.二维数组和指针的关系

  • 数组的数组名是指向数组第一行的数组指针
int a[2][3] = {1,2,3,4,5,6};
int *p = NULL;
int (*q)[3] = NULL;p = &a[0][0];
p = a[0];
p = *a;
q = a;a:指向数组第一行元素的数组指针    int (*)[3]
a[0]:指向a[0][0]的指针           int *
a[1]:指向a[1][0]的指针           int *访问数组第m行第n列元素的方式:
a[m][n]
*(a[m]+n)
*(*(a+m)+n)
*(p+m*N+n)
*(*(q+m)+n)
*(q[m]+n)
q[m][n]

作业

1.封装一个函数,将字符串“12345”转换成整形12345

2.封装函数实现mystrlen,mystrcpy,mystrcat,mystrcmp功能

3.从终端接收五个字符串,对他们排序后输出

#include <stdio.h>int ToNum(char *a)
{int i = 0;int num[32] = {0};int sum = 0;while(*a != '\0'){num[i] = *a - '0';sum = sum * 10 + num[i];i++;a++;}return sum;
}int main(void)
{char a[32] = "12345";printf("outnum = %d\n",ToNum(a));return 0;
}
#include <stdio.h>int mystrlen(const char *str)
{int i = 0;while(*str != '\0'){str++;i++;}return i;
}char *mystrcpy(const char *pstr, char *pret)
{char *ret = pret;while(*pstr != '\0'){*pret = *pstr;pret++;pstr++;}return ret;
}int mystrcmp(const char *pstr, const char *pdst)
{while(*pstr == *pdst){if(*pstr == '\0'){return 0;}pstr++;pdst++;}return *pstr - *pdst;
}char *mystrcat(char *pstr, const char *pdst)
{int len = mystrlen(pstr);char *str = pstr;pstr += len;while(*pdst != '\0'){*pstr = *pdst;pstr++;pdst++;}return str;
}int main(void)
{char str[100] = {0};char dst[100] = {0};char ret[100] = {0};gets(str);gets(dst);printf("strlen:len_str = %d\n",mystrlen(str));printf("strcpy:ret_cpy_str = %s\n",mystrcpy(str,ret));if(mystrcmp(str,dst) > 0){printf("str > cmp\n");}else if(mystrcmp(str,dst) == 0){printf("str = dst\n");}else{printf("str < dst\n");}printf("strcat:new_str = %s\n",mystrcat(str,dst));return 0;
}
#include <stdio.h>
#include <string.h>int main(void)
{char a[5][100] = {0};char *pstr[5] = {a[0], a[1], a[2], a[3], a[4]};char tmp[100] = {0};int i = 0;int j = 0;for(i = 0; i < 5; i++){gets(a[i]);}for(j = 0; j < 4; j++){for(i = 0; i < 4-j; i++){if(strcmp(pstr[i], pstr[i+1]) > 0){strcpy(tmp,pstr[i]);strcpy(pstr[i], pstr[i+1]);strcpy(pstr[i+1], tmp);}}}for(i = 0; i < 5; i++){printf("a[%d] = %s\n",i,a[i]);}return 0;
}

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

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

相关文章

【JAVA EE初阶】多线程(上)

目录 1.预备知识 1.1 冯诺依曼体系结构&#xff1a; 1.2 现代CPU主要关心指标&#xff08;和日常开发密切相关的&#xff09; 1.3 计算机中&#xff0c;一个汉字占几个字节&#xff1f; 1.4 Windows和Linux的区别 1.5 PCB的一些关键要点 2.线程和进程 2.1 创建线程的写法…

用互联网思维扩展电商后台的 CRUD 功能

一、自定义实现MyBatis-Plus逆向工程 多数据源的问题解决了&#xff0c;接下来开始进行实际开发时&#xff0c;你会发现&#xff0c;最麻烦的一件事情就是要创建与数据库表对应的POJO了。这些没什么难度&#xff0c;但是繁琐的内容会占据大量的开发时间。比如一个PmsProducr对…

无代码测试平台ATECLOUD全场景测试方案

ATECLOUD 智能云测试平台是有纳米软件开发的一款以无代码架构与弹性扩展体系为核心的自动化测试平台&#xff0c;通过数据模型驱动的创新设计&#xff0c;为研发、产线等多场景提供高效可控的测试解决方案。​无代码架构 ATECLOUD 打破传统技术壁垒&#xff0c;构建完全可视化的…

当 AI 重构审计流程,CISA 认证为何成为破局关键

在南京审计大学最新发布的《面向审计行业 DeepSeek 大模型操作指南》中&#xff0c;一组数据引发行业深思&#xff1a;通过自动化数据处理、智能风险识别和定制化报告生成&#xff0c;AI 大模型能帮助审计人员降低 40% 以上的人工成本&#xff0c;同时将风险识别准确率提升至 9…

NAT技术、代理服务器

NAT/NAPT技术NAT的全称是network address translation&#xff0c;网络地址转换。NAT 能在对外通信时够将源 IP 转为新源 IP&#xff0c;对内通信时将目的ip转换成新目的ip&#xff0c;实现这个操作&#xff0c;靠的是地址转换表但NAT的说法其实是不准确的&#xff0c;因为多个…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-45,(知识点:负反馈的作用,基础理解,干扰和噪声的抑制)

目录 1、题目 2、解答 步骤一&#xff1a;明确负反馈的作用原理 步骤二&#xff1a;逐一分析选项 3、相关知识点 一、负反馈的基本原理 二、负反馈对干扰和噪声的抑制机制 三、选项分析与答案 四、扩展思考&#xff1a;如何抑制不同位置的干扰&#xff1f; 总结 题目…

Flutter蓝牙BLE开发完全指南(内含高级功能扩展)

Flutter蓝牙BLE开发完全指南 我将为您提供一个完整的Flutter蓝牙BLE实现方案,包含UI设计、权限处理、设备扫描、连接通信等完整功能。 完整实现方案 1. 添加依赖与权限配置 pubspec.yaml dependencies:flutter:sdk: flutterflutter_blue_plus: ^1.10.0permission_handler…

使用 Canvas 替代 <video> 标签加载并渲染视频

在部分浏览器环境或业务场景下&#xff0c;直接使用 <video> 标签加载视频会出现首帧延迟的情况。以下方法通过 WebGPU Canvas 2D 将视频帧绘制到自定义 Canvas 上&#xff0c;让 <video> 只做解码&#xff0c;WebGPU 接管渲染&#xff0c;通过最小化对象创建 精…

基于Flask的智能停车场管理系统开发实践

在现代城市中&#xff0c;停车难已成为一个普遍问题。为了解决这一问题&#xff0c;我开发了一个基于Python Flask框架的智能停车场管理系统。该系统集成了车牌识别、车位状态监控、收费管理等多项功能&#xff0c;为停车场的智能化管理提供了完整的解决方案。系统功能概述该停…

【C#获取高精度时间】

在C#中&#xff0c;有几种方法可以获取高精度时间&#xff08;高分辨率时间戳&#xff09;&#xff0c;适用于性能测量、计时等需要高精度的场景。以下是几种常用方法&#xff1a; 1. 使用 Stopwatch 类&#xff08;推荐&#xff09; Stopwatch 类提供了最高精度的时间测量&…

Spring Boot + React 打造现代化高校成绩管理系统实战记录

作者: 笙囧同学 发布时间: 2025年7月 技术栈: Spring Boot 3.2.3 React 18 TypeScript 华为云GaussDB 项目类型: 全栈Web应用 开发周期: 30天 代码量: 15000 行 &#x1f4d6; 前言 大家好&#xff0c;我是笙囧同学&#xff01;&#x1f64b;‍♂️ 作为一名计算机科学与技…

形参表不匹配(BUG)

在您的代码中&#xff0c;存在两个主要问题导致"形参表中不匹配"的错误&#xff1a;erase() 函数中的成员变量名错误iterator erase(iterator pos) {// ...size--; // ❌ 错误&#xff1a;成员变量名为 _size 而非 sizereturn iterator(next); }修正&#xff1a;ite…

Spring循环依赖以及三个级别缓存

Spring循环依赖以及三个级别缓存 什么是循环依赖&#xff1f; 循环依赖&#xff0c;顾名思义&#xff0c;就是指两个或多个 Spring Bean 之间相互依赖&#xff0c;形成一个闭环。 最常见也是 Spring 能够“解决”的循环依赖是构造器注入 和 setter 注入 混合或单独使用时&…

《零基础入门AI:OpenCV图像预处理进一步学习》

本文全面讲解OpenCV图像预处理的七大核心技术&#xff08;插值方法、边缘填充、图像矫正&#xff08;透视变换&#xff09;、图像掩膜、ROI切割、图像添加水印、图像噪点消除&#xff09;&#xff0c;每个知识点都配有详细解释和实用代码示例&#xff0c;帮助初学者建立系统的图…

MongoDB的内存和核心数对于运行效率的影响

在 MongoDB 线上生产环境中&#xff0c;CPU&#xff08;核心&#xff09; 和 内存 是两大关键硬件资源&#xff0c;它们在不同的操作场景下发挥着核心作用&#xff0c;共同影响着数据库的性能、稳定性和扩展性。理解它们的作用场景至关重要&#xff0c;是容量规划、性能优化和故…

自己的SAPGUI尝试

为满足用户需求&#xff0c;博主做了一个台账管理程序&#xff0c;尝试用自己的程序做GUI&#xff0c;用SAP 系统做数据库。 运行了半年&#xff0c;程序很nice,用户每天都在高效的使用&#xff0c;已经有十几万的数据。 总结一下这次自己的GUI尝试&#xff0c;好处是C# WINFOR…

高效处理 JSON 数据:JsonUtil 工具类全方位解析与实战

在现代软件开发中,JSON(JavaScript Object Notation)已成为数据交换的“通用语言”——从前后端接口通信到微服务数据交互,从配置文件解析到日志格式化,几乎所有场景都离不开JSON的处理。然而,原生JSON框架(如FastJSON、Jackson)的API往往需要大量重复代码,且空指针、…

Python 库手册:xmlrpc.client 与 xmlrpc.server 模块

xmlrpc.client 和 xmlrpc.server 是 Python 标准库中用于构建基于 XML-RPC 协议的远程过程调用&#xff08;RPC&#xff09;通信模块。xmlrpc.client 用于编写客户端程序&#xff0c;向远程服务器发起方法调用。xmlrpc.server 用于编写服务器端&#xff0c;暴露本地方法供远程客…

渲染篇(一):从零实现一个“微型React”:Virtual DOM的真面目

渲染篇(一)&#xff1a;从零实现一个“微型React”&#xff1a;Virtual DOM的真面目 引子&#xff1a;前端性能的“永恒之问” 在前面两章中&#xff0c;我们已经奠定了坚实的架构基础。我们用“任务调度器”建立了声明式和模块化的编程范式&#xff0c;并通过对比MVC等模式论…

SWC 深入全面讲解

一、核心功能与原理 1. 高性能编译 Rust 架构优势&#xff1a;SWC 基于 Rust 编写&#xff0c;利用 Rust 的性能和并发性优势&#xff0c;编译速度比 Babel 快约 20 倍&#xff0c;比 TypeScript 编译器更快。并行编译&#xff1a;支持多线程并行处理&#xff0c;在四核基准测试…