指针的定义与使用

1.指针的定义和使用

int point1(){//定义指针int a = 10;//指针定义语法: 数据类型 * 指针变量名int * p;cout << "sizeof (int(*)) --> " << sizeof(p) << endl;//让指针记录变量a的地址 & 取址符p = &a ;cout << "指针p为:" << p << endl;cout << "变量a的地址为:" << &a << endl;cout << "变量a的值为:" << a << endl;/*** 使用指针 通过<br>解引用</br>的方式来找到指针指向的内存* 指针前加 * 代表解引用,找到指针指向的内存中的地址*/*p = 500;int b = *p;cout << "变量b的值为:" << b << endl;cout << "变量a的值为:" << a << endl;cout << "*p的值为:" << *p << endl;cout << "变量a的地址为:" << &a << endl;cout << "变量b的地址为:" << &b << endl;}输出:sizeof (int(*)) --> 8指针p为:0x16ae5f738
变量a的地址为:0x16ae5f738
变量a的值为:10变量b的值为:500
变量a的值为:500
*p的值为:500
变量a的地址为:0x16ae5f738
变量b的地址为:0x16ae5f72c

2.指针常量和常量指针

指针常量 
 特点:指针的指向不能改,指针指向的值可以改 (内存地址不会变,但是内存地址指向的值会改变)
	int a = 20;int b = 30;cout << "变量a的值:" << a << endl;cout << "变量a的地址:" << &a << endl;//指针常量 特点:指针的指向不能改,指针指向的值可以改 (内存地址不会变,但是内存地址指向的值会改变)int * const p1 = &a;cout << "指针p:" << p1 << endl; //输出的地址cout << "指针p:" << *p1 << endl; // 输出地址指向的值// p1 = &b; //报错,*p1 = 50;cout << "指针p:" << p1 << endl; //输出的地址cout << "指针p:" << *p1 << endl; // 输出地址指向的值输出:变量a的值:20
变量a的地址:0x16b303738
指针p:0x16b303738
指针p:20
指针p:0x16b303738
指针p:50
常量指针 
特点: 指针的指向可以改,但是指针指向的值不可以改
	int a = 50;int b = 30;		//常量指针 特点: 指针的指向可以改,但是指针指向的值不可以改const int * p2  = &a;cout << "变量a的值:" << a << endl;cout << "变量a的地址:" << &a << endl;cout << "指针p2:" << p2 << endl;cout << "指针p2指向的值:" << *p2 << endl;//*p2 = 100;  //报错p2 = &b;cout << "变量a的值:" << a << endl;cout << "变量a的地址:" << &a << endl;cout << "变量b的值:" << b << endl;cout << "变量b的地址:" << &b << endl;cout << "指针p2:" << p2 << endl;cout << "指针p2指向的值:" << *p2 << endl;输出:变量a的值:50
变量a的地址:0x16b06b738
指针p2:0x16b06b738
指针p2指向的值:50
变量a的值:50
变量a的地址:0x16b06b738
变量b的值:30
变量b的地址:0x16b06b734
指针p2:0x16b06b734 
指针p2指向的值:30

 3.指针数组 --》 是一个数组

指针数组 -- 存放指针的数组

int* arr[3]; // 整形指针的数组

char* arr1[10]; // 字符型指针的数组

4.数组指针 --》 是一个指针

int main()
{int* p = NULL; // p是整形指针 -- 指向整形的指针 -- 存放整形的地址char* pc = NULL; // pc是字符指针 -- 指向字符的指针 -- 存放字符的地址// 数组指针 -- 是不是指向数组的指针? -- 存放数组的地址int arr[10] = {0,6,0};printf("数组首元素地址 %p \n",arr);printf("数组首元素地址 %p \n",&arr[0]);printf("整个数组的地址 %p \n",&arr);// 如何存放数组地址呢? &arr 指向整个数组的指针// 想让 parr 指向整个数组(而不仅仅是第一个元素),你需要声明 parr 为 int (*)[10] 类型的指针。int (*parr)[10] = &arr;printf("parr %p\n",parr);printf("Second element: %d\n", (*parr)[1]);  // 通过数组指针访问第二个元素char pch[10] = {'w','c'};char (*pch1)[10] = &pch;printf("Second element: %c\n", (*pch1)[1]);  // 通过数组指针访问第二个元素// 定义一个字符型指针数组char* pc1[10];// 字符指针的地址又该如何存放呢?char* (*pa)[10] = &pc1;}

下面代码哪个是数组指针?

Int* p1[10]; // 存放指针的数组

Int (*p2)[10]; // 存放数组地址的指针

 

    int arr5[10] = {1,2,3,4,5,6,7,8,9,10};int (*arr5_2)[10] = &arr5;for (int i = 0; i < 10; i++) {printf("%d ",(*arr5_2)[i]); // 不太容易理解}printf("\n");// 第二种写法for (int i = 0; i < 10; i++) {// *arr5_2 == arr5 ==> 首元素的地址 ==》 arr5_2+i 即表示指针向右移动printf("%d ",*(*arr5_2+i));}printf("\n");

5.函数指针 --》 指向函数的指针 

estimate 函数接受一个整数 lines 和一个指向函数的指针 pf,这个函数指针指向一个接受 int 类型参数并返回 double 的函数。

// 函数示例,符合 estimate 的要求
double myFunction(int x) {return x * 1.5;
}void estimate(int lines,double (*pf)(int))
{cout << (*pf)(lines) << endl;  // 调用函数指针 pf
}

estimate 函数内部,(*pf)(lines) 用于调用函数指针 pf,并将 lines 作为参数传递给它。

*pf 是一个函数指针的解引用操作。pf 是一个指向函数的指针,*pf 解引用这个指针,得到指向的函数。

例如,如果 pfdouble (*pf)(int) 类型的函数指针,那么 *pf 是一个函数,其参数是 int,返回值是 double。你可以用 (*pf)(args) 来调用这个函数,传递参数 args

5.1声明函数指针

函数指针是指向函数的指针,允许你通过指针来调用函数。

// 函数声明
void printMessage();
void anotherFunction();// 函数定义
void printMessage() {
std::cout << "Hello, World!" << std::endl;
}void anotherFunction() {
std::cout << "This is another function." << std::endl;
}// 定义一个函数指针,指向返回类型为 void、参数为无的函数
void (*funcPtr)();// 指向 printMessage 函数
funcPtr = printMessage;
(*funcPtr)(); // 调用 printMessage// 指向 anotherFunction 函数
funcPtr = anotherFunction;
(*funcPtr)(); // 调用 anotherFunction// ------------------
// 第一种写法
typedef int (*ptr1)(int,int);int Add(int a,int b)
{int c = a + b;printf("result is %d\n",c);
}// 一个函数,接受一个整数和一个回调函数
void process(int value1, int value2,ptr1 callback) {// 对值进行某种处理value1 *= 2;value2 *= 2;// 调用回调函数callback(value1,value2);
}process(5,7,Add);// 第二种写法// 指向函数的指针,用于指向一个接受两个 int 参数并返回 int 的函数(例如 Add 函数)int (*ptr1)(int,int);// 将函数指针指向 Add 函数ptr1 = Add;// 通过函数指针调用 Add 函数ptr1(5,6);

声明指向某种数据类型的指针时,必须指定指针指向的类型。同时,声明指向函数的指针时,也必须指定指针指向的函数类型。这意味着声明应指定函数的返回类型以及函数的特征标(参数列表)。也就是说,声明应像函数原型那样指出有关函数的信息。例如,假设Pam leCoder编写一个估算时间的函数,其原型如下:

double pam(int)

则正确的指针类型声明如下:

double (*pf)(int)

这与pam()声明类似,这是将pam替换成了(*pf)。由于pam是函数,因此( *pf)也是函数,而如果( *pf)是函数,则pf就是函数指针

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

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

相关文章

Git开发实战

本文对开发中git的常用概念和操作做一个总结。参考绿毛鸭子的部分内容。 git分布式的体现 1.本地完整的版本库&#xff1a; 每个克隆下来的 Git 仓库都包含了项目的所有历史记录、提交、分支等信息。这意味着每个开发者的本地仓库是一个完整的版本控制系统&#xff0c;包括…

ingress-nginx 开启 Prometheus 监控 + Grafana 查看指标

环境已经部署了 ingress-nginx&#xff08;DaemonSet 方式&#xff09;&#xff0c;并且 Prometheus Grafana 也已经运行。但之前 /metrics 端点没有暴露 Nginx 核心指标&#xff08;如 nginx_ingress_controller_requests_total&#xff09;&#xff0c;经过调整后现在可以正…

ThinkPHP 5.1 中的 error 和 success 方法详解

1、success() 方法 public function someAction() {// 操作成功逻辑...return $this->success(操作成功, 跳转地址, 额外数据); } 参数说明 参数类型说明默认值msgstring成功提示信息空字符串urlstring跳转URLnull (不跳转)datamixed返回的额外数据nullwaitinteger跳转等…

抗辐照MCU在卫星载荷电机控制器中的实践探索

摘要:在航天领域&#xff0c;卫星系统的可靠运行对电子元件的抗辐照性能提出了严苛要求。微控制单元&#xff08;MCU&#xff09;作为卫星载荷电机控制器的核心部件&#xff0c;其稳定性与可靠性直接关系到卫星任务的成败。本文聚焦抗辐照MCU在卫星载荷电机控制器中的应用实践&…

计算机视觉——相机标定

计算机视觉——相机标定 一、像素坐标系、图像坐标系、相机坐标系、世界坐标系二、坐标系变换图像坐标系 → 像素坐标系相机坐标系 → 图像坐标系世界坐标系 → 相机坐标系 ⋆ \star ⋆ 世界坐标系 → 像素坐标系 三、相机标定 一、像素坐标系、图像坐标系、相机坐标系、世界坐…

好未来0520上机考试题1:括号的最大嵌入深度

题目 &#xff08;LeetCode 1614.括号的最大嵌入深度&#xff09; 给定 有效括号字符串 s&#xff0c;返回 s 的嵌套深度。嵌套深度是嵌套括号的最大数量。 示例 1&#xff1a; 输入&#xff1a;s "(1(2*3)((8)/4))1" 输出&#xff1a;3 解释&#xff1a;数字…

MySQL复杂SQL(多表联查/子查询)详细讲解

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 MySQL复杂SQL&#xff08;多表联查/子查询&a…

Spring中循环依赖问题的解决机制总结

一、解决机制 1. 什么是循环依赖 循环依赖是指两个或多个Bean之间相互依赖对方&#xff0c;形成一个闭环的依赖关系。最常见的情况是当Bean A依赖Bean B&#xff0c;而Bean B又依赖Bean A时&#xff0c;就形成了循环依赖。在Spring容器初始化过程中&#xff0c;如果不加以特殊…

集运维_安装linux,麒麟等系统_步骤

u盘工具选择Ventoy,Rufus 在选择Ventoy和Rufus这两款U盘启动盘制作工具时,需根据具体需求权衡其优缺点: ‌核心差异‌ ‌多系统支持‌: ‌Ventoy‌:支持将多个ISO、WIM、IMG等类型的镜像文件直接复制到U盘,实现‌一盘多用‌(例如同时存放Windows、Linux等镜像),无需…

第4章:Cypher查询语言基础

Cypher是Neo4j的声明式图查询语言&#xff0c;专为处理图数据而设计。它允许用户以直观、高效的方式查询和修改图数据库中的数据。本章将介绍Cypher的基本概念和语法&#xff0c;帮助读者掌握使用Cypher进行基础图数据操作的能力。 4.1 Cypher语言概述 Cypher是Neo4j的主要查…

上位机知识篇---Flask框架实现Web服务

本文将简单介绍Web 服务与前端显示部分,它们基于Flask 框架和HTML/CSS/JavaScript实现,主要负责将实时视频流和检测结果通过网页展示,并提供交互式状态监控。以下是详细技术解析: 一、Flask Web 服务架构 1. 核心路由设计 @app.route(/) def index():"""…

Neovim - 打造一款属于自己的编辑器(一)

文章目录 前言&#xff08;劝退&#xff09;neovim 安装neovim 配置配置文件位置第一个 hello world 代码拆分 neovim 配置正式配置 neovim基础配置自定义键位Lazy 插件管理器配置tokyonight 插件配置BufferLine 插件配置自动补全括号 / 引号 插件配置 前言&#xff08;劝退&am…

按字典序排列最小的等效字符串

文章目录 题目思路解题过程Python代码C代码复杂度 题目 给出长度相同的两个字符串s1 和 s2 &#xff0c;还有一个字符串 baseStr 。 其中 s1[i] 和 s2[i] 是一组等价字符。 举个例子&#xff0c;如果 s1 “abc” 且 s2 “cde”&#xff0c;那么就有 ‘a’ ‘c’, ‘b’ ‘…

Ubuntu2404 下搭建 Zephyr 开发环境

1. 系统要求 操作系统&#xff1a;Ubuntu2404&#xff08;64位&#xff09;磁盘空间&#xff1a;至少 8GB 可用空间&#xff08;Zephyr 及其工具链较大&#xff09; 2. 安装必要工具 Tool Min. Version CMake 3.20.5 Python 3.10 Devicetree compiler 1.4.6 2.1 安装系…

2025年06月07日Github流行趋势

项目名称&#xff1a;netbird 项目地址url&#xff1a;https://github.com/netbirdio/netbird项目语言&#xff1a;Go历史star数&#xff1a;14824今日star数&#xff1a;320项目维护者&#xff1a;mlsmaycon, braginini, pascal-fischer, lixmal, pappz项目简介&#xff1a;使…

fast-reid部署

配置设置&#xff1a; 官方库链接&#xff1a; https://github.com/JDAI-CV/fast-reid# git clone https://github.com/JDAI-CV/fast-reid.git 安装依赖&#xff1a; pip install -r docs/requirements.txt 编译&#xff1a;切换到fastreid/evaluation/rank_cylib目录下&a…

clickhouse 和 influxdb 选型

以下是 ClickHouse、InfluxDB 和 HBase 在体系架构、存储引擎、数据类型、性能及场景的详细对比分析: 🏗️ ‌一、体系架构对比‌ ‌维度‌‌ClickHouse‌‌InfluxDB‌‌HBase‌‌设计目标‌大规模OLAP分析,高吞吐复杂查询 时序数据采集与监控,优化时间线管理高吞吐随机…

ros创建工作空间配置运行状态机

ROS 一、创建工作空间目录 /home/wict/workspace/hudahua/ros/catkin_ws #初始化工作空间&#xff08;仅需一次&#xff09; catkin_init_workspace二&#xff1a;回到根目录编译 #创建正确的工作空间结构&#xff08;如果尚未创建&#xff09; mkdir -p ~/workspace/hudahua…

【看到哪里写到哪里】C的“数组指针”

C里面&#xff0c;数组指针&#xff0c;不是基本类型。顾名思义&#xff0c;数组指针&#xff0c;是指针&#xff0c;是指向数组的指针&#xff1b; 1.它的基本定义样子是 type (*ptr)[size]; 这个指针&#xff0c;指向的数组的&#xff1b;这里要注意&#xff0c;要定义数组…

深度相机的日常学习

文章目录 一、深度相机的概念二、深度相机的工作原理三、深度相机的应用领域 一、深度相机的概念 深度相机&#xff08;Depth Camera&#xff09;是一种能够捕捉场景中物体距离信息的设备&#xff0c;与传统的 RGB 相机不同&#xff0c;深度相机不仅可以获取场景的二维图像信息…