C语言—深入理解指针(3)

1.字符指针变量

一般使用:

另一种使用方法:

“hello world”是一个常量字符串,不能被修改。

上述代码是将字符串中的首字符‘h’赋值给指针pstr,用%s打印字符串的时候,只需要提供首字符的地址就行。(如果你解引用,那么打印出来的只有h)

首先str1和str2是两个数组,起始地址不一样,所以str1!=str2。

但是内存相同的常量字符串只需要保存一份就够了!它们的起始地址都一样,所以str3=str4。(只读数据区)

2.数组指针变量

数组指针—指向数组的指针—数组指针变量中存放数组的地址。

int:p指向的数组的元素类型

(*p):p是数组指针变量名

[10]:p指向数组的元素个数

练习:

练习:

p是指向数组的,*p就是解引用,相当于拿到这个数组arr,所以再在后面加上[i]。

3.二维数组传参本质

二维数组可以理解为一维数组的数组,二维数组的每一行可以看做是一个一维数组,所以二维数组其实是一个一维数组的数组,二维数组的首元素就是他的第一行。故:二维数组的名字就是第一行的地址。

解析:arr是第一行数组的整体地址,+i,这样(arr+i)就是第i行的地址,然后取值*(arr+i),这样就是arr[i],这个arr[i]也表示地址(数组名),然后+j,就是arr[i][j]的地址,最后来一个取值*。

4.函数指针变量

4.1函数指针变量的创建

其实函数也是有地址的。由上述代码可以发现,&Add和Add的结果是一样的,它们都是函数的地址。

上述是:函数指针变量

4.2 函数指针变量的应用

例1:

例2:

(*(void(*)())0)()

是一次函数调用,调用0地址处放的那个函数。

0地址处放的这个函数是没有参数,返回类型是void

例3:

上述代码是一次函数的声明,函数的名字叫signal,signal函数的参数有2个。

第一个参数的类型是int,第二个参数的类型是一种函数指针void(*)(int)

signal函数的返回类型也是一个函数指针,类型是void(*)(int)

该函数指针指向的函数参数是int,返回类型是void

4.3 typedef 关键字

typedef是用来类型重命名的,可以将复杂的类型简单化。

比如:你觉得unsigned int 写起来太麻烦,想写成短的uint。

如果是指针类型,也是可以的。

但是对于数组指针和函数指针稍微有点区别:

比如我们有数组指针类型int(*)[5],需要重命名为parr_t,那可以这样写:

函数指针类型的重命名也是一样的,比如,将void(*)(int)类型重命名为pf_t,就可以这样写:

5.函数指针数组

改造一下,写成函数指针数组。

6.转移表

函数指针数组的用途:转移表

举例:计算器的一般实现 

#include <stdio.h>void menu()
{printf("************************************\n");printf("********    1.add   2.sub   ********\n");printf("********    3.mul   4.div   ********\n");printf("********    0.exit          ********\n");printf("************************************\n");
}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 main()
{int input = 1;int x = 0;int y = 0;int ret = 0;int (*pfArr[5])(int, int) = { 0,Add,Sub,Mul,Div };do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:printf("请输入两个操作数:");scanf("%d %d", &x, &y);Add(x, y);break;case 2:printf("请输入两个操作数:");scanf("%d %d", &x, &y);Sub(x, y);break;case 3:printf("请输入两个操作数:");scanf("%d %d", &x, &y);Mul(x, y);break;case 4:printf("请输入两个操作数:");scanf("%d %d", &x, &y);Div(x, y);break;case 0:printf("退出计算器");break;default:printf("选择错误,重新选择");break;}ret = pfArr[input](x, y);printf("结果是:%d\n", ret);} while (input);return 0;
}

作者自述:本文主要针对C语言的指针知识。内容中包含了很多总结内容。本文制作不易,求求动动你们发财的小手点个赞和关注,这是对我创造最大的动力。后续我也会跟进内容,尽量一周至少一次,保证内容的质量。如果有想知道的内容或者有建议的地方,欢迎后台私信或者在本文留言哦。感谢各位的支持捏Thanks♪(・ω・)ノ。

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

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

相关文章

Golang | Leetcode Golang题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; func setZeroes(matrix [][]int) {n, m : len(matrix), len(matrix[0])col0 : falsefor _, r : range matrix {if r[0] 0 {col0 true}for j : 1; j < m; j {if r[j] 0 {r[0] 0matrix[0][j] 0}}}for i : n - 1; i > 0; i-- {for …

华大hc32l170,新建工程遇到的坑

使用官方给的例程没问题。 然后我在keil新建一个工程&#xff0c;简单的初始化 /********************************************************************************** \brief Main function of project**** \return uint32_t return value, if needed********************…

C语言 | Leetcode C语言题解之第72题编辑距离

题目&#xff1a; 题解&#xff1a; static inline int Min(const int a, const int b, const int c) {int min (a < b) ? a : b;return (min < c) ? min : c; }int minDistance(char * word1, char * word2){int m strlen(word1), n strlen(word2);int dp[m 1][n…

SliderCaptcha滑块验证码功能

SliderCaptcha滑块验证码功能 资源文件及文档&#xff1a;https://gitee.com/LongbowEnterprise/SliderCaptcha <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><…

亚信科技精彩亮相2024中国移动算力网络大会,数智创新共筑“新质生产力”

4月28至29日&#xff0c;江苏省人民政府指导、中国移动通信集团有限公司主办的2024中国移动算力网络大会在苏州举办。大会以“算力网络点亮AI时代”为主题&#xff0c;旨在凝聚生态伙伴合力&#xff0c;共同探索算力网络、云计算等数智能力空间&#xff0c;共促我国算网产业和数…

mysql数据库标识符的使用

ddl CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL,userName varchar(20) DEFAULT NULL,pwd varchar(36) DEFAULT NULL,phone varchar(11) DEFAULT NULL,age tinyint(3) unsigned DEFAULT NULL,sex char(2) DEFAU…

101_Linux文件挂载系统相关

一、文件系统简介 传统的磁盘与文件系统应用中,一个分区就只能够被格式化成为一个文件系统,所以我们可以说一个文件系统就是一个硬盘分区。 随着新技术的出现如LMM与软件磁盘阵列software raid),这些技术可以将一个分区格式化为多个文件系统(例如LWM),也能够将多个分区合成一…

easyExcel导出百万数据

先说一下需求场景,导出接口不能直接查询数据源,是通过接口远程调用,要求支持动态表头,需要支持导出200w以上数据.设计如下: 1.由于数据远程调用,大量数据查询导出不符合实际情况,这里采取远程调用接口,将数据写入华为obs,使用追加写入的方式,可以分批查询写入,避免一次查询全部…

前端数据可视化基础(折线图)

目录 前言&#xff1a; 画布&#xff1a; 折线图 (Line Chart): 前言&#xff1a; 前端中的数据可视化是指将大量数据以图形或图像的形式在前端页面上展示出来&#xff0c;以便用户能够更直观地理解和分析这些数据。数据可视化是一种强大的工具&#xff0c;它利用了人类视觉…

如何查看页面对应的Selenium定位参数

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

SpringBoot配置热部署devtools工具

文章目录 spring-boot-devtools介绍配置热部署devtools工具一、引入依赖二、配置文件三、设置【自动重启更新】效果 spring-boot-devtools介绍 spring-boot-devtools是一组开发工具&#xff0c;其中包括热部署功能。spring-boot-devtools的热部署功能允许开发人员在开发过程中…

阿里云发布通义千问2.5,OpenCompass上得分追平GPT-4 Turbo

5月9日消息&#xff0c;阿里云正式发布通义千问2.5&#xff0c;模型性能全面赶超GPT-4 Turbo&#xff0c;成为地表最强中文大模型。同时&#xff0c;通义千问最新开源的1100亿参数模型在多个基准测评收获最佳成绩&#xff0c;超越Meta的Llama-3-70B&#xff0c;成为开源领域最强…

nmap使用教程

nmap使用教程 一、nmap简介二、nmap常用命令2.1、target specification&#xff08;目标规范&#xff09;2.1.1、用法2.1.2、详情 2.2、HOST DISCOVERY&#xff08;主机发现&#xff09;2.2.1、用法2.2.2、详情 2.3、SCAN TECHNIQUES&#xff08;扫描技术&#xff09;2.4、PORT…

[openwrt-21.02]MT7981+MT7976 WiFi 校准数据打包方法

Openwrt 版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/"…

开源交互审计系统:功能强大、安全好用【送源码】

在当今信息化时代&#xff0c;网络安全越来越受到重视。传统的远程控制工具&#xff0c;如RDP、SSH、VNC等&#xff0c;虽然方便易用&#xff0c;但存在安全隐患&#xff0c;容易被黑客利用。很多时候我们都需要做一些防护的处理来来保障网络安全。 今天了不起来分享一款开源好…

【总结】CE认证详解

文章目录 CE认证 CE作用 适用范围 测试项目 一、2014/30/EU指令&#xff0c;电磁兼容&#xff08;EMC&#xff09;测试项目 二、2014/35/EU指令&#xff0c;低电压&#xff08;LVD&#xff09;测试项目 三、2011/65/EU指令&#xff0c;有害物质&#xff08;RoHS&#xff09…

postsql数据库等保测评命令

psql -U postgres \c 查看连接的数据库和用户名 pg_ctl --version或者&#xff1a;select version(); select * from pg_hba_file_rules; 展示 pg_hba.conf 文件内容的系统表或视图 show shared_preload_libraries; 密码复杂度 select * from pg_shadow 查看valuntil 字段密码…

C#图像:1.图像区域分割与提取

&#xff08;1&#xff09;创建一个名为SplitImage的窗体的应用程序&#xff0c;将窗体改名为FormSplitImage。 &#xff08;2&#xff09;创建一个名为ImageProcessingLibrary的类库程序&#xff0c;为该工程添加名为ImageProcessing的静态类 &#xff08;3&#xff09;为Imag…

二进制转为HEX数组小工具

在使用RA8889时&#xff0c;JPG的解码只能从FLASH的DMA通道获取&#xff0c;那么如果要从远端、或者SD卡等处读取JPG图片出来显示怎么办&#xff1f; RA8889支持JPG图片硬解码&#xff0c;但数据流是从FLASH进行DMA读取的&#xff0c;然后再进行解码。因此这种情况下&#xff…

游戏陪玩平台app小程序H5源码交付游戏陪玩接单软件游戏陪玩源码 陪玩小程序陪玩工作室运营模式陪玩管理系统游戏陪玩工作室怎么做

提供陪玩平台源码&#xff0c;陪玩系统源码&#xff0c;陪玩app源码&#xff0c;团队各部门配备齐全&#xff0c;分工明确&#xff0c;及时对接开发进度&#xff0c;保证开发效率 一、陪玩平台源码的功能介绍 1、派单大厅:陪玩系统源码的派单大厅内支持用户通过语音连麦的方式…