指针系列三

文章目录

  • 1.字符指针:
  • 2.数组指针:
  • 3.二维数组传参的本质
  • 4.函数指针变量
    • typedef 关键字
  • 5.函数指针数组
  • 6.转移表

在这里插入图片描述

1.字符指针:

字符指针,也称为字符串指针,是指向内存中的字符或字符串的指针。
在C语言中,字符串被表示为以空字符 '\0' 结尾的字符数组。

#include <stdio.h>int main() 
{// 字符指针的声明和初始化char *str = "Hello, bit!";// 使用字符指针打印字符串printf("字符串: %s\n", str);// 使用指针算术运算访问单个字符printf("第一个字符: %c\n", *str);printf("第二个字符: %c\n", *(str + 1));return 0;
}

解释:

  • 我们声明一个字符指针 str 并将其初始化为字符串 "Hello, bit!"。本质是把字符串hello world的首地址放到了str中。
  • 然后使用 %s 格式说明符打印整个字符串。
  • 使用指针算术运算,我们访问并打印字符串的单个字符。
    在这里插入图片描述
    来看一道字符串相关的笔试题 ——from《剑指offer》
#include <stdio.h>
int main()
{char str1[] = "hello bit";char str2[] = "hello bit";const char* str3 = "hello bit";const char* str4 = "hello bit";if (str1 == str2)printf("str1 and str2 are same\n");elseprintf("str1 and str2 are not same\n");if (str3 == str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0;
}

在这里插入图片描述

2.数组指针:

数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量

int *p1[10];
//p是一个指针变量数组(数组的元素类型都是指针),指针指向整型数组
int (*p2)[10];
//p是一个指针变量,然后指向的是大小为10的整型数组
//(数组元素10个,每个元素类型是int)

[]的优先级是要高于*的,所以必须加上( )来保证p*先结合
在这里插入图片描述

#include <stdio.h>int main() 
{// 声明并初始化整型数组int arr[] = {1, 2, 3, 4, 5};// 声明一个数组指针int *ptr;// 使用数组的基地址初始化数组指针ptr = arr;// 使用数组指针访问数组元素printf("数组元素: ");for (int i = 0; i < 5; i++){printf("%d ", *(ptr + i));}printf("\n");return 0;
}

运行结果
在这里插入图片描述

#include <stdio.h>int main()
{// 声明并初始化整型数组int arr[5] = { 1, 2, 3, 4, 5 };// 声明一个数组指针int (*ptr)[5]=&arr;//得到的是数组地址return 0;
}

在这里插入图片描述

在这里插入图片描述

解释:

  • 我们声明一个整型数组 arr 并将其初始化为一些值。
  • 我们声明一个数组指针 ptr
  • 使用数组 arr 的基地址初始化数组指针 ptr
  • 使用指针算术,我们访问并打印数组的元素。

字符指针和数组指针的区别:

  1. 数据类型:

    • 字符指针(char *)用于指向字符或字符串。
    • 数组指针(int *float *等)用于指向数组的第一个元素。
  2. 用途:

    • 字符指针通常用于字符串的操作和处理。
    • 数组指针用于高效访问数组的元素。

3.二维数组传参的本质

先看不用指针怎么实现二维数组的传参

#include <stdio.h>
void test(int a[3][5], int r, int c)
{int i = 0;int j = 0;for (i = 0; i < r; i++){for (j = 0; j < c;j++){printf("%d " , a[i][j]);}printf("\n");}
}
int main()
{int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };test(arr, 3, 5);return 0;
}

在这里插入图片描述
这里实参是二维数组,形参也可以写出二维数组
那么用指针怎么写捏
首先我们要明确,二维数组名表示的是第一行的地址
我们可以知道一维数组的类型是int[5],所以第一行第地址数组类型就是int(*)[5]
那就意味着二维数组传参的本质是传递了地址,传递的是这个一维数组的地址

所以我们可以这么写

#include <stdio.h>
void test(int *p [5], int r, int c)
{int i = 0;int j = 0;for (i = 0; i < r; i++){for (j = 0; j < c;j++){printf("%d " , *(*(p+i)+j));//*(p+i)[j];}printf("\n");}
}
int main()
{int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };test(arr, 3, 5);return 0;
}

总结:二维数组传参,形参可以写成数组,也可以写成指针
在这里插入图片描述

4.函数指针变量

先看一段代码

#include<stdio.h>
void test()
{printf("hehe\n");
}
int main()
{printf("test: %p\n", test);printf("&test: %p\n", &test);return 0;
}

在这里插入图片描述

所以为了存放函数地址,就有了函数指针变量

void test()
{printf("hehe\n");
}
void(*pf1)() = &test;
void (*pf2)() = test;int Add(int x, int y)
{return x + y;
}
void(*pf3)(int, int) = Add;
void(*pf4)(int x, int y) = &Add;//x和y写上和省略都是可以的

在这里插入图片描述
一个例子

#include <stdio.h>
int Add(int x, int y)
{return x + y;
}
int main()
{int (*pf3)(int, int) = Add;printf("%d\n", (*pf3)(2,3));printf("%d\n", pf3(3, 5));return 0;
}

在这里插入图片描述**加粗样式**

两段有趣 的代码
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
都出自《c陷阱和缺陷》

typedef 关键字

在这里插入图片描述
如果是指针类型,能否重命名呢?其实也是可以的,⽐如,将int*重命名为 ptr_t,这样写:
在这里插入图片描述
但是对于数组指针和函数指针稍微有点区别:
⽐如我们有数组指针类型int(*)[5] ,需要重命名为parr_t,那可以这样写
在这里插入图片描述
新类型名 要在*右边
函数指针类型的重命名也是⼀样的,⽐如,将 void(*)(int)类型重命名为 pf_t,就可以这样写:

在这里插入图片描述

在这里插入图片描述
上面第二段有趣代码的简化

5.函数指针数组

以下哪个会是正确写法呢
在这里插入图片描述
答案是:parr1
parr1 先和 [] 结合,说明 parr1是数组,数组的内容是什么呢?
int (*)()类型的函数指针。

6.转移表

在这里插入图片描述

函数指针用途:转移表
举例:计算器的一般实现

#include <stdio.h>int add(int a, int b)
{return a + b;
}sub(int a, int b)
{return a - b;
}int mul(int a, int b)
{return a * b;
}int div(int a, int b)    
{return a / b;
}int main() {int ret = 0;int input= 1;int X, Y;do{printf("1:add 2:sub 3:mul 4:div 0:exit\n");scanf("%d", &input);printf("Enter the value of X: ");scanf("%d", &X);printf("Enter the value of Y: ");scanf("%d", &Y);switch (input) {case 1:ret = add(X, Y);break;case 2:ret = sub(X, Y);break;case 3:ret = mul(X, Y);break;case 4:ret = div(X, Y);break;case 0:printf("退出程序\n");break;default:printf("Invalid option");break;}printf("%d\n", ret);}while(input);return 0;
} 

使用函数指针数组来实现

#include <stdio.h>int add(int a, int b)
{return a + b;
}sub(int a, int b)
{return a - b;
}int mul(int a, int b)
{return a * b;
}int div(int a, int b)    
{return a / b;
}int main() {int ret = 0;int input = 1;int x, y;int(*p[5])(int x, int y) = { 0,add,sub,mul,div };do{printf("1:add 2:sub 3:mul 4:div 0:exit\n");scanf("%d", &input);if ((input <= 4 && input >= 1)){printf("请输入操作数\n");scanf("%d %d", &x, &y);ret = (*p[input])(x, y);printf("ret = %d\n", ret);}else if (input == 0){printf("退出计算机\n");}else{printf("输入有误\n");}}while(input);return 0;
}

未完待续…
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【树莓派4B】如何用树莓派的串口发送数据给单片机

文章目录 查看路由器中的树莓派IProot连接打开vnc远程桌面服务打开win的远程桌面软件输入IP和端口串口发送数据硬件连接树莓派发送 查看路由器中的树莓派IP root连接 打开vnc远程桌面服务 vncserver :1打开win的远程桌面软件 输入IP和端口 192.168.3.33:1输入密码qwer1234后点…

嫁接打印的技术要点

所谓嫁接打印&#xff0c;是一种增减材混合制造的方式。它将已成形的模具零件当作基座&#xff0c;在此基础上“生长”出打印的零件。其中基座通常采用传统加工方式制造&#xff0c;而打印部分则使用专用的金属粉末&#xff0c;通过 3D 打印技术成型。 嫁接打印之所以备受欢迎&…

Docker + Django跨域解决方案

什么是Django Django 是一个开源的高级 Python Web 框架&#xff0c;它鼓励快速开发并遵循可重用和可维护的实践。Django 是在 MTV&#xff08;模型-模板-视图&#xff09;模式的基础上设计的&#xff0c;这个模式类似于但不同于 MVC&#xff08;模型-视图-控制器&#xff09;模…

centos安装mysql-client

直接安装&#xff1a; yum install mysql-community-client报了错误No package mysql-community-client available. 原因&#xff1a;CentOS/RHEL系统默认的软件源中并不包含MySQL软件包&#xff0c;需要通过添加第三方存储库来获取MySQL相关软件 添加源 安装MySQL官方的Yum…

使用FFmpeg处理RTSP视频流并搭建RTMP服务器实现图片转直播全流程

目录 一、FFmpeg安装与配置教程二、搭建并配置Nginx RTMP服务器三、从RTSP视频流提取帧并保存为图片四、将图片序列转换为视频五、将视频推送为直播流六、将图片序列推送为直播流 在实时音视频领域&#xff0c;我们经常需要处理从各种源&#xff08;如摄像头&#xff09;获取的…

Yolov8目标检测——在Android上部署Yolov8 tflite模型

1. 简介 YOLOv8 是一种用于目标检测的深度学习模型&#xff0c;它是 YOLO&#xff08;You Only Look Once&#xff09;系列的最新版本之一。YOLO 系列因其高效和准确性而在计算机视觉领域非常受欢迎&#xff0c;特别是在需要实时目标检测的应用中&#xff0c;如视频监控、自动…

Jmeter中线程组介绍

1.线程数的意义 Jmeter采用了线程来模拟用户&#xff0c;即1个线程代表1个用户&#xff0c;线程可以简单理解为计算机处理任务时的一个具体执行人。 一个任务可以由多个人&#xff08;线程&#xff09;共同完成&#xff0c;也可以由一个人&#xff08;线程&#xff09;来完成&a…

Fastapi+docker+tortoise-orm+celery

因为项目是后期引入celery,所以导致构建docker的时候只有fastapi的项目&#xff0c;celery的重启比较麻烦 1.docker安装celery pip install celery安装celery的时候注意python版本与celery版本的适配&#xff0c;有些celery的版本不支持python的版本&#xff0c;具体的版本请看…

网络基础-ICMP协议

ICMP&#xff08;Internet Control Message Protocol&#xff0c; Internet控制消息协议&#xff09; ICMP协议是IP协议的辅助协议&#xff0c;用于在IP网络上发送控制消息&#xff0c;它通常被用于诊断网络故障、执行网络管理任务以及提供一些错误报告&#xff1b;对于收集各…

深入理解线程的两阶段终止模式:确保线程安全退出

序言 在多线程编程中&#xff0c;线程的安全退出是一个重要的问题。在实际应用中&#xff0c;我们经常需要确保线程在退出时能够完成必要的清理工作&#xff0c;同时避免因资源泄漏或状态不一致而导致的问题。线程的两阶段终止模式是一种解决这个问题的有效方法。本文将深入探…

React - sass配置

1. idea下载Easy Sass插件&#xff1a; 2. 启用后&#xff0c;我们写的scss文件不能直引用&#xff0c;所以还要下载sass依赖&#xff1a; (推荐使用.scss&#xff0c;因为与原生.css写法接近&#xff0c;.sass格式更严格) // 下载sass依赖 npm install sass sass-loader --s…

目标检测算法YOLOv7简介

YOLOv7由Chien-Yao Wang等人于2022年提出&#xff0c;论文名为&#xff1a;《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/2207.02696 &#xff0c;项目网页&#xff…

【Linux】从零开始认识动静态库 - 静态库

送给大家一句话: 永不言弃&#xff0c;就是我的魔法&#xff01; ——阿斯塔《黑色四叶草》 ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ଘ(੭ˊ꒳​ˋ)੭✧ 从零…

Linux虚拟机运行“yum install gcc-c++”报错“Loading mirror speeds from cached hostfile”

目录 一、在Linux上安装Redis时&#xff0c;在终端执行命令“yum install gcc-c”时&#xff0c;报错&#xff1a; 二、然后发现linux的网络不通&#xff0c;什么网站都访问不了 三、连上网后&#xff0c;再变换yum源 四、重新运行yum install gcc 一、在Linux上安装Redis时…

Java中55种锁,高级面试题,最新面试题

Java中乐观锁在实际应用中如何解决并发问题&#xff1f; 乐观锁通过假设并发冲突发生概率较低来解决并发问题&#xff0c;主要通过数据版本控制实现。在更新数据前&#xff0c;会检查数据版本是否发生变化&#xff0c;只有在数据版本未变时才允许更新&#xff0c;这样可以避免…

nginx_01

1.安装 yum install epel-release -y # 安装yum的扩展包 yum install nginx -y systemctl start nginx.service #启动nginx systemctl enable nginx.service # netstat -lntup # 查看端口占用情况 # 可以看到nginx默认占用了80端口 2.nginx配置 # 注意配置文件的语法格式…

万物生长大会 | 创邻科技再登杭州准独角兽榜单

近日&#xff0c;由民建中央、中国科协指导&#xff0c;民建浙江省委会、中国投资发展促进会联合办的第八届万物生长大会在杭州举办。 在这场创新创业领域一年一度的盛会上&#xff0c;杭州市创业投资协会联合微链共同发布《2024杭州独角兽&准独角兽企业榜单》。榜单显示&…

小红书搞钱美学课-6.0升级版,账号搭建/爆款创作/工具实战/账号变现篇

让我们用视觉撬动流量 课程体系 334253课程权益(5周服务期) 3节账号运营基础课3节自媒体笔记创作课。4节封面设计实操课2次实操加餐分享5次作业指导(一对一)3次答疑直播 课程大纲 一、账号搭建篇 变现模板、精准定位 二、爆款创作篇爆款选题、首图、文案与脚本、快速涨粉…

【计算机毕业设计】springboot工资管理系统

人类现已迈入二十一世纪&#xff0c;科学技术日新月异&#xff0c;经济、资讯等各方面都有了非常大的进步&#xff0c;尤其是资讯与 网络技术的飞速发展&#xff0c;对政治、经济、军事、文化等各方面都有了极大的影响。 利用电脑网络的这些便利&#xff0c;发展一套工资管理系…

权力集中,效率提升,中心化模式的优势与挑战

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#x1f525;&#xff1a;探索设计模式的魅力&#xff1a;权力集中…