初识指针4の学习笔记

目录

 

1>>前言

2>>字符指针变量

3>>数组指针变量

4>>函数指针变量

5>>函数指针数组

6>>回调函数是什么?

7>>结语


 

1>>前言

        今天我会继续分享一些我做的笔记,以及我对指针的理解, 后续会持续分享指针几天,毕竟指针的内容太多了,一天我也学不完,也分享不完,感谢大家理解,希望我的文章对大家有所帮助,谢谢!

2>>字符指针变量

        afc4fffd80c64cb2ae72fecccdbca91a.png

这就是一个简单的字符指针变量,再来看:

fa4b7e970b014a9a976ce2bbc796c8ec.png

p1和p2有什么区别呢?两者的相同点是,这两个指针都取首字母地址,两个字符串都是连续的空间,不同点就是,p1所指向的是一个常量字符串,不能被修改,而p2指向的是一个数组,可以修改。通过下面这张图更好理解:

9a6100f897104293b96cb685c318d684.png

接下来我们来看剑指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;
}

这个是正确答案:

24eb0ebed3214dbcbcb7b319bbaac638.png

可以看到str1和str2的结果不相同,str3和str4的结果相同,因为,st1和2是两个数组,虽然内容一样,但是它们在内存中毕竟是两个数组,地址肯定是不一样的,那为什么3和4相同呢?注意看前面的const修饰了指针,在创建3时,const定义了里面的内容不能被修改,那4又跟3一样,所以编译器会认为4跟3是同一个地址。

3>>数组指针变量

        首先来了解什么是数组指针变量,先前学的字符指针变量用来存放字符变量的地址,整形指针变量用来存放整形指针的地址,那么数组指针变量顾名思义,用来存放整个数组的地址。

int a[8];

int (*p)[8]=&a;  注意:这里存放的是整个数组的地址,并不是首元素地址

那p的类型是什么呢?a的类型是int  ,int* b中b的类型是int*,咦?好像都是除了变量名以外的东西,那可以知道p的类型就是 int(*)[8]

此时,对p解引用也就是*p得到的就是整个数组的地址,对p+1就跳过整个数组。

联系前面的博客,二维数组中每一个元素都是一个一维数组,那么二维数组传参时也就是传一维数组整个数组的地址。

int (*p)[8]=&a得知 p=&a

通过等价代换:*p=*&a        *p=a         所以对整个数组解引用就能得到首元素地址

4>>函数指针变量

        了解了数组指针变量后,函数指针变量也如它的名字一般,存放函数的地址。

前面可以知道数组指针变量的类型为: 数组类型(*变量名)[元素个数],那么函数指针变量就是,函数类型 (*变量名)(函数内置元素类型),请看

c20bde2fc1b34283831bcb57d4b90022.png

5562940ba6de4fac99ab4f5302a13199.png这就是函数指针变量,这个&符号可以省略。

如果想要调用函数,也可以使用p进行调用。

5>>函数指针数组

        函数指针数组就是存放函数指针的数组:

#include<stdio.h>
int add(int a,int b)
{return a+b;
}
int sub(int a,int b)
{return a-b; 
}
int main()
{int a=20;int b=10;int (*p1)(int,int)=add;int (*p2)(int,int)=sub;//int(*)(int,int)是函数指针类型 ,只需再*旁边加上数组名和元素个数即可。 int (* pp[2])(int,int)={add,sub};return 0;
}

int(*)(int,int)是函数指针类型 ,只需再*旁边加上数组名和元素个数就是函数指针数组,类型为int(*)(int,int)。那么怎么使用呢?可以用于一些判断条件,如:需要加时,调用pp[1],需要减时调用pp[2]等等。

6>>回调函数是什么?

        如果把函数的指针也叫地址,作为参数传给了另一个函数,当这个指针被用来调用所指向的函数时,被调用的函数就叫做回调函数。

#include<stdio.h>int add(int a,int b)
{return a+b;
}
void test(int(*p)(int,int))//此时对p解引用就是add 
{int a=10;int b=20;int c=p(a,b);printf("%d\n",c); 
}
int main()
{test(add);return 0;
}

e20c5ea085614940994bc49297918793.png

此时add就叫做回调函数。可以理解为通过指针,在另一个函数被调用了

7>>结语

        今天又学习了很多内容,以学习笔记+经验的方式呈现给大家希望能得到大家喜欢谢谢大家!能看到这的我都坚信能有所收获,你的耐心给将来的你最大的帮助,谢谢观看!期待下篇与你的相见!

 

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

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

相关文章

Vue状态管理工具:vuex

目录 基本概念 使用步骤 核心概念 1.State 2.Getters 3.Mutations 4.Actions 5.Modules 辅助函数 基本概念 基础用法 基本概念 官方&#xff1a;Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以…

Android全面解析之context机制(三): 从源码角度分析context创建流程(下)

前言 前面已经讲了什么是context以及从源码角度分析context创建流程&#xff08;上&#xff09;。限于篇幅把四大组件中的广播和内容提供器的context获取流程放在了这篇文章。广播和内容提供器并不是context家族里的一员&#xff0c;所以他们本身并不是context&#xff0c;因而…

查找物理学领域文献的常用数据库

当我们查找文献时如果盲目去各个文献数据库查找不仅浪费时间和精力还不一定能找到自己需要的文献。我们需要对数据库有个简单的了解有方向的去寻找我们研究领域的文献资料&#xff0c;本文就向大家介绍一下查找物理学领域文献的数据库有哪些。 一、物理专业数据库&#xff08;…

Android平台无纸化同屏如何实现实时录像功能

技术背景 我们在做无纸化同屏的时候&#xff0c;好多开发者采集到屏幕、麦克风|扬声器数据&#xff0c;除了需要推RTMP出去&#xff0c;或者启动个轻量级RTSP服务&#xff0c;对外提供个拉流的RTSP URL&#xff0c;别的终端过来拉流&#xff08;小并发场景&#xff09;&#x…

vue3基础ref,reactive,toRef ,toRefs 使用和理解

文章目录 一. ref基本用法在模板中使用ref 与 reactive 的区别使用场景 二. reactive基本用法在模板中使用reactive 与 ref 的区别使用场景性能优化 三. toRef基本用法示例在组件中的应用主要用途对比 ref 和 toRef 四. toRefs基本用法示例在组件中的应用主要用途对比 ref 和 t…

基于Arch的轻量级发行版Archcraft结合内网穿透实现远程SSH连接

文章目录 前言1. 本地SSH连接测试2. Archcraft安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接5. 固定SSH公网地址6. SSH固定地址连接 前言 本文主要介绍如何在Archcraft系统中安装Cpolar内网穿透工具,并以实现Windows环境ssh远程连接本地局域网Archcraft系统来说明使用内网…

高性能web服务器详解

一、Web服务的基础介绍 正常情况下单次web服务访问的流程简图&#xff1a; 1.1 Web服务介绍 这里介绍的是 Apache 和 NGINX 1.1.1 Apache 经典的Web服务端 Apache 起初由美国的伊利诺伊大学香槟分校的国家超级计算机应用中心开发 目前经历了两大版本分别是 1.X 和 2.X…

笔试练习day5

目录 游游的you题目解析解法方法一贪心方法二 腐烂的苹果题目解析例子1例子2解法多源BFS最短路径代码代码解析 JZ62 孩子们的游戏(圆圈中最后剩下的数)题目解析解法方法一模拟环形链表模拟数组模拟 方法二递推/递归/动态规划状态表示状态转移方程代码 感谢各位大佬对我的支持,如…

Mysql原理与调优-Mysql的内存结构

1.绪论 前面说过InnoDB每次查询数据或者更新数据&#xff0c;都是先以16kb的大小将数据读取到内存中&#xff0c;然后对内存中的数据页进行操作。为了减少磁盘IO&#xff0c;Innodb的会先单独的申请一块连续的空间&#xff0c;将从磁盘中的数据页缓存到这片内存中。这片内存就…

2D Inpainting 与NeRF 3D重建的多视角一致性问题

一 问题&#xff1a; NeRF依赖于输入图像的一致性。NeRF&#xff08;Neural Radiance Fields&#xff09;在生成三维场景时&#xff0c;依赖于从多个视角拍摄的输入图像之间的一致性来准确地推断场景的三维结构和颜色信息。 具体来说&#xff1a; 多视角一致性&#xff1a; Ne…

Hive3:三种常用的复杂数据类型

一、Array类型 1、数据示例 2、实操 元数据 zhangsan beijing,shanghai,tianjin,hangzhou wangwu changchun,chengdu,wuhan,beijin创建表 CREATE TABLE myhive.test_array(name string, work_locations array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY \t…

LVM 使用以及配置

逻辑卷管理 (LVM) 是一种用于 Linux 系统的存储管理工具&#xff0c;比传统的磁盘分区方法更灵活。LVM 通过将物理存储设备组合成逻辑卷&#xff0c;使得磁盘空间的管理更加动态和便捷。它提供了物理层的抽象&#xff0c;让用户可以创建跨越多个物理磁盘或分区的逻辑卷。 LVM …

2024年软件测试经典面试题(全三篇)【包含答案】做完面试进入大厂不是梦

前言 迎来的便是金九银十&#xff0c;一直想着说分享一些软件测试的面试题&#xff0c;这段时间做了一些收集和整理&#xff0c;下面共有三篇经典面试题&#xff0c;大家可以试着做一下&#xff0c;答案附在后面&#xff0c;希望能帮助到大家。 软件测试经典面试题&#xff0…

【vue讲解:es6导入导出语法、 vue-router简单使用、登录跳转案例、scoped的使用、elementui使用】

1 es6导入导出语法 # 做项目&#xff1a;肯定要写模块--》导入使用# 默认导出和导入 在某个js中 # 命名导出和导入1.1 默认导出和导入 // #########导出语法########### // export default name // 只导出变量 // export default add // 只导出函数// export default {nam…

android13顶部状态栏里面调节背光 背景闪烁问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.彩蛋 1.前言 android13顶部状态栏里面调节背光, 背景闪烁问题,会出现画面不全问题,如下图 2.问题分析 这里看起来是由于隐藏的时候,界面显示是一个渐变的隐藏,但是后面的背景又是…

Vue3列表(List)

效果如下图&#xff1a;在线预览 APIs List 参数说明类型默认值bordered是否展示边框booleanfalsevertical是否使用竖直样式booleanfalsesplit是否展示分割线booleantruesize列表尺寸‘small’ | ‘middle’ | ‘large’‘middle’loading是否加载中booleanfalsehoverable是否…

stripe Element 如何使用

这里要准备好几个东西&#xff1a; 一个支付成功过后的回调 还有一个下单的接口 一旦进入这个下单界面&#xff0c;就要去调下单的接口的&#xff0c;用 post, 这个 接口你自己写&#xff0c;可以写在后端中&#xff0c;也可以放到 nextjs 的 api 中。 首先说的是这个下单…

Linux ubuntu 24.04 运行《文明5》游戏,解决游戏中文设置的问题!

Linux ubuntu 24.04 运行《文明5》游戏&#xff0c;解决游戏中文设置的问题&#xff01; 《文明5》是一款回合制经营策略游戏&#xff0c;拼的就是科技发展速度&#xff0c;点的是科技树&#xff0c;抢的就是科技制高点&#xff0c;但是真的是时间漫长&#xff0c;可能需要好几…

会“坐”电梯,能避障碍,AGV无人搬运车进入各行各业

AGV 近年来&#xff0c;自动导引车&#xff08;Automated Guided Vehicle&#xff0c;简称AGV&#xff09;作为一种先进的物流设备&#xff0c;在制造业中广泛应用。AGV是一种能够自主行驶的无人驾驶车辆&#xff0c;通过内置的导航系统和传感器&#xff0c;实现对环境的感知与…

keepalived总结

一、概述 定义&#xff1a;Keepalived是一个用于实现服务器高可用性和负载均衡的软件&#xff0c;通过VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由器冗余协议&#xff09;实现故障转移。主要功能&#xff1a; 高可用系统网络服务&#xff1a;能够…