玩转指针(3)
一、字符指针变量
字符指针变量(如char* p)的两种赋值方式
①将字符类型地址赋值给字符指针变量
int main()
{char a = 'w';char* p = &a;*p = 'm';return 0;
}
②将常量字符串赋值给字符指针变量
常量字符串的介绍:用" "引起来的就是常量字符串,常量字符串存放在只读数据区,这块区域的内容是可以用的,但是不能被修改的。
将常量字符串赋值给字符指针时,可以将字符指针当做一个字符数组,此时数组的内容无法修改。
int main()
{char* p = "abcdef";//"abcdef"是常量字符串,常量字符串在内存中是连续存放的,且p里面是常量字符串中首字符a的地址/*因此可以认为p是一个字符数组,可以用下标来访问数组中的内容。p数组的内容无法修改,因为常量字符串的内容无法修改*/for (int i = 0; i < 6; i++){printf("%c ", p[i]);}return 0;
}
一道关于字符指针变量的面试题
二、数组指针变量
①何为数组指针变量
字符指针变量(如char * p),p中存放的是字符变量的地址,p指向的是字符;整型指针变量(如int * p),p中存放的是整型变量的地址,p指向的是整型。同理,数组指针变量存放的是数组的地址(&数组名),它指向的是数组。
小练习:正确书写数组指针变量
②数组指针变量的使用
但这种写法不常见,通常不会这么写
③区分指针数组与数组指针
int main()
{//指针数组int a = 0, b = 0, c = 0;int* arr[3] = { &a,&b,&c };//arr是指针数组,数组中每个元素的类型都是int *//数组指针int* (*p)[3] = &arr;//括号中的*表示p是数组指针,存放的是数组arr的地址。它指向的数组类型是int* [3]return 0;
}
三、二维数组传参的本质
①二维数组的数组名
二维数组的每一行可以看做是一个一维数组,即二维数组是由一维数组组成的数组。二维数组的首元素就是它的第一行,因此二维数组的数组名就是数组第一行的地址。
②二维数组中的元素在内存中是连续存放的
③二维数组传参
二维数组传参时,实参写数组名,形参既可以写成数组的形式(此时二维数组的行的大小可以省略),也可以写成指针的形式。
a、形参写成指针的形式
b、形参写成数组的形式
c、补充
对一维数组而言: arr[i]==*(arr+i)
对二维数组而言: arr[i][j] =* (*(arr+i)+j)
四、函数指针变量
①函数地址的介绍:
数组有地址,变量(如int a)也有地址,那么函数有地址吗?答案是有的。函数的地址是存放在函数指针变量中的。&(函数名)与函数名均表示函数的地址,两者没有区别。 这点与数组不同:&(数组名)表示取出整个数组的地址,数组名表示数组首元素的地址。
② 函数指针变量的创建
函数指针变量是用来存放函数的地址
int Add(int x, int y)
{return x + y;
}int main()
{int(*pa)(int, int) = Add;//或者写成int(*pa)(int x,int y)=Add;//*表示pa是指针变量(函数指针变量),存放的是函数Add的地址。pa指向的函数的返回类型为int,函数的两个参数也是int类型//pa的类型是int(*)(int, int)//*pa表示通过pa中Add的地址,调用Add函数int ret1 = (*pa)(3, 5);printf("%d\n", ret1);//8//一般调用Add函数的方式int ret2 = Add(3, 5);//这里的Add是函数名,也就是函数的地址。pa中存放的也是函数的地址,故可以将这里的Add换成paret2 = pa(3, 5);return 0;
}
总结:可以通过函数名(函数的地址)来调用函数,也可以通过对函数指针变量解引用来调用函数。
③
④
⑤
五、typedef关键字
①作用
用于对变量类型(如int、int*)重新命名,将复杂类型的名字简单化。
//比如觉得unsigned int这个类型比较复杂,那么就可以使用typedef将该类型重命名为unit
typedef unsigned int unit;
int main()
{unsigned int a = 1;//等价于unit a=1;return 0;
}
②typedef关键字的使用
typedef int* ptr_t;
int main()
{ptr_t a;//等价于int* a;return 0;
}
③typedef在重命名数组指针类型和函数指针类型时,稍微有点不同
a.typedef在重命名数组指针类型
typedef int(*parr)[5];//将数组指针类型int(*)[5]重命名为parr
//typedef int(*)[5] parr 这种写法是错误的
int main()
{int arr[5] = { 0 };int(*p)[5] = &arr;//数组指针p的类型是int(*)[5]parr m = &arr;return 0;
}
b.typedef重命名函数指针类型
typedef int (*pf)(int, int);//将函数指针类型int (*)(int, int)重命名为pf
//typedef int (*)(int, int) pf 这种写法是错误的int Add(int x, int y)
{return x + y;
}
int main()
{int (*p)(int, int) = Add;//p是函数指针变量,它的类型是int (*)(int, int)pf p2 = Add;return 0;
}
④
⑤
六、函数指针数组
①函数指针数组是用来存放函数指针或者函数的地址。(函数指针也是用来存放函数的地址,但函数指针只能存放一个函数的地址,而函数指针数组可以存放多个相同类型函数的地址)
②函数指针数组该怎么写呢?
先写出函数指针变量,然后对函数指针变量进行使当的修改,就是函数指针数组。
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(*p)(int, int) = Add;//p是函数指针变量,p所指向的函数的返回类型是int,函数的两个参数的类型也是intint(* p1[4])(int, int) = { Add,Sub,Mul,Div };//p1是函数指针数组的数组名,数组有4个元素,每个元素的类型都是int(*)(int,int)return 0;
}
③函数指针数组的使用
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(*p1)(int, int) = Add;int(*p2)(int, int) = Sub;int(*p3)(int, int) = Mul;int(*p4)(int, int) = Div;//p1、p2、p3、p4是四个函数指针变量,分别存放四个函数的地址,比较麻烦。//观察到这四个函数的类型是一样的,因此可以使用函数指针数组来存放四个函数的地址int(*p[4])(int, int) = {Add,Sub,Mul,Div};//p是函数指针数组的数组名,数组有4个元素,每个元素都是int(*)(int,int)类型//p[0]=Add,p[1]=Sub,p[2]=Mul,p[3]=Divfor (int i = 0; i < 4; i++){printf("%d\n", p[i](6, 3));}return 0;
}
七、转移表
/*设计一个简单的计算器,实现整数的加减乘除*/
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;
}
void menu()
{printf("***** 1.Add 2.Sub *****\n");printf("***** 3.Mul 4.Div *****\n");printf("***** 0.exit *****\n");
}
int main()
{int input = 0;int x = 0, y = 0, ret = 0;do{menu();printf("请选择:");scanf("%d", &input);int(*p[5])(int, int) = { 0,Add,Sub,Mul,Div }; //转移表if (input >= 1 && input <= 4){printf("请输入两个操作数:");scanf("%d %d", &x, &y);ret = p[input](x, y);printf("%d\n", ret);}else if (input == 0){printf("退出计算器\n");}else{printf("输入错误,请重新输入\n");}} while (input);return 0;
}
相关文章:
玩转指针(3)
一、字符指针变量 字符指针变量(如char* p)的两种赋值方式 ①将字符类型地址赋值给字符指针变量 int main() {char a w;char* p &a;*p m;return 0; }②将常量字符串赋值给字符指针变量 常量字符串的介绍:用" "引起来的就…...
【CSS in Depth 2 精译_040】6.3 CSS 定位技术之:相对定位(下)—— 用纯 CSS 绘制一个三角形
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结)第二章 相对单位(已完结)第三章 文档流与盒模型(已完结)第四章 Flexbox 布局(已…...
HTML流光爱心
文章目录 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心(简易版)7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心(双心版)1…...
java技能
日志实际使用 log.error(“111”,e);和 System.out.println(ExceptionUtils.getStackTrace(error)); 日志查询 tail -f root.log 前端页面命名: mounted(){ document.title‘设备可视页面’ } 查看ips所属mac nbtstat -a 10.87.236.60 获取容器名称 hostName In…...
本省第一所!新大学,揭牌!
9月26日,海南艺术职业学院举行揭牌仪式,标志着海南省第一所公办艺术类高等职业院校正式揭牌成立。海南省旅文厅党组成员、副厅长刘成出席揭牌仪式,省教育厅党组成员、副厅长邢孔政在揭牌仪式上宣读省人民政府同意设立海南艺术职业学院的批复。…...
企业微信(企微)审批与影刀RPA结合
企业微信审批与影刀RPA结合 效果先看视频: 影刀与企业微信审批结合 具体步骤: 1、登录企微管理后台,新建一个审批流。 添加模板→自定义模板,根据需求添加审批节点。 添加完之后,回到审批界面,可以看…...
新手教学系列——用 VSCode 实现高效远程开发
随着软件开发环境日益复杂,远程开发已成为许多开发者的日常工作方式。尤其当项目需要直接在服务器上运行或本地计算资源有限时,能够使用一款便捷、强大的工具至关重要。在众多 IDE 中,VSCode 因其轻量、灵活且支持丰富插件,成为远程开发的理想选择。本文将详细介绍如何通过…...
[uni-app]小兔鲜-04推荐+分类+详情
热门推荐 新建热门推荐组件, 动态设置组件的标题 <template><!-- 推荐专区 --><view class"panel hot"><view class"item" v-for"item in list" :key"item.id">... ...<navigator hover-class"none&…...
PHP人才机遇桥梁招聘求职全能系统小程序源码
人才机遇桥梁 —— 招聘求职全能系统全解析 💼🚀 🌉 搭建人才与机遇的桥梁 在这个竞争激烈的职场环境中,找到一份心仪的工作或招募到合适的人才,往往不是一件容易的事。但幸运的是,我们有了“人才机遇桥梁…...
计算机毕业设计Hadoop+Spark抖音可视化 抖音舆情监测 预测算法 抖音爬虫 抖音大数据 情感分析 NLP 自然语言处理 Hive 机器学习 深度学习
Python抖音可视化开题报告 一、研究背景与意义 随着移动互联网的迅猛发展,短视频平台如抖音已成为人们日常生活中不可或缺的一部分。抖音以其独特的算法和内容推荐机制,吸引了数以亿计的用户。然而,随着用户规模的不断扩大,如何…...
Linux 学习 awk 和sed 命令使用
awk 命令 awk 是一种处理文本文件的语言,是一个强大的文本分析工具。 awk 通过提供编程语言的功能,如变量、数学运算、字符串处理等,使得对文本文件的分析和操作变得非常灵活和高效。 之所以叫 awk 是因为其取了三位创始人 Alfred Aho&#x…...
双端搭建个人博客
1. 准备工作 确保你的两个虚拟机都安装了以下软件: 虚拟机1(Web服务器): Apache2, PHP虚拟机2(数据库服务器): MariaDB2. 安装步骤 虚拟机1(Web服务器) 安装Apache2和PHP 更新系统包列表: sudo apt update安装Apache2: sudo apt install apache2 -y安装PHP及其Apac…...
PHP 面向对象编程
PHP 面向对象编程 PHP 是一种流行的服务器端脚本语言,广泛用于 web 开发。它支持多种编程范式,包括面向对象编程(OOP)。面向对象编程是一种编程风格,它使用“对象”来设计软件,其中对象是数据和行为的集合…...
应急响应(1)-同事电脑
一、现象 重要时间节点,同事反馈桌面有鼠标移动、随机断网;发现登录账户多了一个,由于电脑长时间没有更改过密码,导致忘记密码无法登录。随机联系进行应急处理。 二、排查 2.1、密码重置/删除 由于同事忘记密码导致无法进行登录…...
class 023 随机快速排序
这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。 这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐. https://space.bilibili.com/8888480?spm_id_f…...
如何理解矩阵的复数特征值和特征向量?
实数特征值的直观含义非常好理解,它就是在对应的特征向量方向上的纯拉伸/压缩。 而复数特征值,我们可以把它放在复数域中理解。但是这里给出一个不那么简洁、但是更加直观的理解方式:把它放在实空间中。那么复数特征值表现的就是旋转等比放大…...
怎么查看网站是否被谷歌收录,查看网站是否被搜索引擎收录5个方法与步骤
要查看网站是否被谷歌(Google)或其他搜索引擎收录,是网站管理和SEO(搜索引擎优化)中的一个重要环节。以下是查看网站是否被搜索引擎收录5个方法与步骤,帮助您确认网站是否被搜索引擎成功索引: …...
Java工具--stream流
Java工具--stream流 过滤(filter)统计求最大最小和均值求和(sum)过滤后,对数据进行统计 遍历(map)规约(reduce)排序(sorted)去重(dist…...
什么是 JWT?它是如何工作的?
松哥最近辅导了几个小伙伴秋招,有小伙伴在面小红书时遇到这个问题,这个问题想回答全面还是有些挑战,松哥结合之前的一篇旧文和大伙一起来聊聊。 一 无状态登录 1.1 什么是有状态 有状态服务,即服务端需要记录每次会话的客户端信…...
微信小程序使用picker,数组怎么设置默认值
默认先显示请选择XXX。然后点击弹出选择列表。如果默认value是0的话,他就直接默认显示数组的第一个了。<picker mode"selector" :value"planIndex" :range"planStatus" range-key"label" change"bindPlanChange&qu…...
Springboot生成树工具类,可通过 id/code 编码生成 2.0版本
优化工具类中,查询父级时便利多次的问题 import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.mutable.MutableLong; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; import org.spri…...
17、CPU缓存架构详解高性能内存队列Disruptor实战
1.CPU缓存架构详解 1.1 CPU高速缓存概念 CPU缓存即高速缓冲存储器,是位于CPU与主内存间的一种容量较小但速度很高的存储器。CPU高速缓存可以分为一级缓存,二级缓存,部分高端CPU还具有三级缓存,每一级缓存中所储存的全部数据都是…...
算法训练营打卡Day18
目录 二叉搜索树的最小绝对差二叉搜索树中的众数二叉树的最近公共祖先额外练手题目 题目1、二叉搜索树的最小绝对差 力扣题目链接(opens new window) 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。 示例: 思…...
【leetcode】169.多数元素
boyer-moore算法最简单理解方法: 假设你在投票选人 如果你和候选人(利益)相同,你就会给他投一票(count1),如果不同,你就会踩他一下(count-1)当候选人票数为0&…...
MyBatis<foreach>标签的用法与实践
foreach标签简介 实践 demo1 简单的一个批量更新,这里传入了一个List类型的集合作为参数,拼接到 in 的后面 ,来实现一个简单的批量更新 <update id"updateVislxble" parameterType"java.util.List">update model…...
R语言Shiny包新手教程
R语言Shiny包新手教程 1. 简介 Shiny 是一个 R 包,用于创建交互式网页应用。它非常适合展示数据分析结果和可视化效果。 2. 环境准备 安装R和RStudio 确保你的计算机上安装了 R 和 RStudio。你可以从 CRAN 下载 R,或从 RStudio 官网 下载 RStudio。…...
[大象快讯]:PostgreSQL 17 重磅发布!
家人们,数据库界的大新闻来了!📣 PostgreSQL 17 正式发布,全球开发者社区的心血结晶,带来了一系列令人兴奋的新特性和性能提升。 发版通告全文如下 PostgreSQL 全球开发小组今天(2024-09-26)宣布…...
CHI trans--Home节点发起的操作
总目录: CHI协议简读汇总-CSDN博客https://blog.csdn.net/zhangshangjie1/article/details/131877216 Home节点能够发起的操作,包含如下几类: Home to Subordinate Read transactionsHome to Subordinate Write transactionsHome to Subor…...
Rust和Go谁会更胜一筹
在国内,我认为Go语言会成为未来的主流,因为国内程序员号称码农,比较适合搬砖,而Rust对心智要求太高了,不适合搬砖。 就个人经验来看,Go语言简单,下限低,没有什么心智成本,…...
记HttpURLConnection下载图片
目录 一、示例代码1 二、示例代码2 一、示例代码1 import java.io.*; import java.net.HttpURLConnection; import java.net.URL;public class Test {/*** 下载图片*/public void getNetImg() {InputStream inStream null;FileOutputStream fOutStream null;try {// URL 统…...
怎么查网站是那个公司做的/互联网推广的好处
传送门 二分答案 \(k\),考虑如何 \(hash\) 使得做起来方便 把每个点挂在 \(k1\) 级祖先上,考虑在祖先上删除 这道题巧妙在于其可以对于 \(dfs\) 序/括号序列 \(hash\) 这样在 \(k1\) 级祖先上暴力删除就好了 # include <bits/stdc.h> using namesp…...
网站建设与管理教程/chrome浏览器官网入口
阿里巴巴有2大核心的分布式技术,一个是OceanBase,另一个就是RocketMQ。在实际项目中已经领教过RocketMQ的强大,RocketMQ实战系列,将涵盖RocketMQ的简介,环境搭建,初步使用、API详解、架构分析、管理员集群操…...
怎样做卖活网站/新闻软文推广案例
分布式:一个任务由多个人协作完成。比如饭馆里有负责点菜的,有负责做菜的,有负责传菜的。比如饭馆里有买菜的,洗菜的,切菜的,炒菜的比如饭馆里有好几个负责做菜的 集群:多个人紧密协作ÿ…...
三门峡网站建设电话/360网站推广怎么做
初学者应该选择学习Python还是C语言 发布时间:2020-11-21 14:11:31 来源:亿速云 阅读:74 作者:小新 小编给大家分享一下初学者应该选择学习Python还是C语言,希望大家阅读完这篇文章后大所收获,下面让我们一…...
自己做下载类网站/搜索引擎关键词优化方案
Linux Cat命令及使用详解时间Red Hat Linux 有一个工具程序,它能够帮助你保留简短列表,将这些列表收集起来,甚至向你透漏一点你的系统信息。这个工具叫做Linux Cat,它是concatenate [k?nk?tineit](连锁)的简写,意思是…...
做网站的工作/靠谱的免费建站
继 2014 年 3 月 Java 8 发布之后,时隔 4 年,2018 年 9 月,Java 11 如期发布,其间间隔了 Java 9 和 Java 10 两个非LTS(Long Term Support)版本。作为最新的LTS版本,相比 Java 8,Java 11 包含了模块系统、改…...