C语言-指针(二)
一级指针
一级指针指的是存储了变量地址的指针
一级指针的变量类型是 类型 + *
一级指针的类型与变量的类型有些不同
例:int * p 前面的int * 是该地址的类型
int a = 0;
int * p = a;
这里的指针 p 就是一级指针
二级指针
指针变量也是变量因此也会有地址
而存储指针变量地址的指针称为二级指针
语法结构:指针类型 ** 变量名 int ** pp = &p;
二级指针的类型是 类型 + **
例:int ** p 前面的int ** 是该二级指针的类型
int a = 10;
int *p = &a; // p 是一级指针,存储变量a的地址
int **pp = &p; // pp 是二级指针,存储指针p的地址
// 通过 pp 修改 a 的值
**pp = 20; // 等价于 *(*pp) = 20 → *p = 20 → a = 20
二级指针的变量名可以随意取,上述例子使用“ pp ”来表示,是一种命名习惯
并不表示二级指针的变量名要进行双写
指针形式得理解
int a = 10; int *p = &a; 这里的int表示的是被取变量地址的类型是int*p ,前面的 * 表示的是p是一个指针变量
int * *pp = &p; int* 表示的是被取的一级指针的变量是int**pp 前面的 * 表示的是pp是一个指针变量
指针的套娃
一级指针到二级指针在形式上就是多加了一个 *
在二级指针上在多加一个 * 就变成了三级指针,三级指针上在加一个 * 就变为四级以此类推,可以无限的套娃,但在平时使用中,二级指针已经满足使用要求,一般不使用三级以后的指针
一级指针二级指针的解引用
int a = 10;
int * p =&a;
int ** pp =&p;printf(“%p”,*pp); 这里使用解引用的个数决定了访问pp的那个地址的数据一个 * 表示访问的是二级指针 pp 的地址
printf(“%p”,**pp); 两个 * 表示访问的二级指针指向的一级指针的地址
printf(“%d”,**pp); 如果要访问一级指针的值则将前面的 %p 改为 %d
数组指针
数组指针的本质上还是数组,只是数组中存放的元素变成了指针
语法结构为:数据类型 * 数组名 [ 数组长度 ] ;
int *ptrArray[5]; // 声明一个包含5个int型指针的数组
char *strArray[3]; // 声明一个包含3个char型指针的数组
数组指针模拟二维数组
int arr1[] = {1,2,3,4,5};
int arr2[] = {2,3,4,5,6};int* parr[2] = {arr1, arr2};//数组指针存放的地址是数组首元素的地址模拟二维数组的访问
printf("%d",arr[i][j])
访问数组时,使用两个下标来确认访问那个数组,即该数组的两个元素
这里的arr[i][j] 等价于 *( *(arr+1)+j)
*( *(arr+i)+j) 中间的*(arr+1)表示的取下标为i的数组外层的*( +j)表示的是取数组下标为j的元素
形式上虽然和二维数组相同,但本质上并不是二维数组
在运行时,是以指针的方式进行计算的在使用printf进行打印时,可以使用for循环进行遍历
将i,j的值进行循环即可将数组指针的所以值打印出来
字符指针变量
字符指针变量本质上是存放字符地址的指针
存储的是字符类型(char
)数据的内存地址
字符指针变量存储的是字符串中第一个字符的地址
因为字符是连续存储的,所以可以通过运算符,下标来访问对应的字符
char ch = 'A'; // 定义一个字符变量
char *p = &ch; // p存储ch的地址,即指向字符'A'
char *str = "Hello"; // str存储字符串"Hello"的首字符'H'的地址
数组指针变量
数组指针变量是用于存放数组地址的指针,指向的是数组的地址
语法结构:数据类型 (*指针名)[数组长度];
int (*p)[4]; // 定义一个指向包含4个int元素的数组的指针
数组指针初始化
二维数组的初始化无需使用&
int arr[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int (*p)[4] = arr; // p指向二维数组的首元素,即二维数组中的第一行数组(arr=arr[0])
//输出
printf("%d\n", p[1][2]); // 输出 arr[1][2] 的值(7)
一维数组的初始化必须使用&
int row[4] = {100, 200, 300, 400};
int (*p)[4] = &row; //使用&来获取一维数组的地址
//输出
printf("%d\n", (*p)[2]); // 输出 row[2](300)
二维数组传参的本质
二维数组传参的本质是通过数组指针传递并计算内存地址
当二维数组作为参数传递给函数时,数组名会退化为指向其首行的数组指针
传递的是二维数组中第一行的数组的指针的地址,而非单个元素的指针
二维数组的所有操作本质上都可以通过数组指针来理解(并不是只要传参才通过数组指针来进行的)
int arr[3][4] = {...};
void func(int (*p)[4], int rows); 参数p是数组指针
func(arr, 3); arr退化为 int(*)[4] 类型的指针将数组名去掉剩下的就是指针的类型
函数指针变量
用于存储函数的地址,允许通过指针间接调用函数
语法结构:函数的返回类型 ( * 指针名)(参数类型1,参数类型2);
int add (int a,int b)
{int c = a + b;return c;
}
int (*pf)(int, int); 指向函数的参数是两个int类型pf在命名习惯上表示存放函数的地址
使用函数指针调用函数
语法结构:( * 指针名)(参数类型1,参数类型2);
int result = pf(3, 4); 利用函数名调用函数int result = (*pf)(3, 4); 利用函数指针调用函数
(*pf)等价于pf , (3,4)表示的是给函数传递的参数
typedef关键字
用于为已有的数据类型定义新的名称(别名)
它的核心目的是简化复杂类型的声明,提高代码的可读性和可维护性
语法结构:typedef 原类型 新类型名;
typedef int Integer; // 将 int 重命名为 Integer
Integer a = 10; // 等价于 int a = 10;
指针类型 //此时的Integer表示为int
typedef int * pf;
pf a ; //等价于int * a;
数组指针
typedef int(*pf)[5]; //取得别名要放在数组名的位置上,不能放在末尾
函数指针
typedef void(*pf)(int);//函数指针与数组指针同理//取得别名要放在数组名的位置上,不能放在末尾
typedef
与 #define
的区别
在声明指针时
typedef int* IntPtr;
IntPtr a, b; // a 和 b 均为 int* 类型#define IntPtr int* //仅第一个变量被替换为指针,第二个为int
IntPtr a, b; // 展开为 int* a, b; → a 是 int*,b 是 int(错误!)
因为#define的底层机制是单纯的文本替换,不具有任何的类型类型逻辑
替换后的代码中,* 仅作用于紧邻的变量,导致多个变量声明时类型不一致
特性 | typedef | #define |
---|---|---|
处理阶段 | 编译时类型处理 | 预处理时文本替换 |
作用域 | 受限于块作用域 | 全局替换,无作用域限制 |
类型安全性 | 严格类型检查 | 无类型检查,可能引入错误 |
适用场景 | 类型别名 | 宏定义、常量、代码片段替换 |
函数指针数组
将多个函数的地址存入数组中,那么这个数组称为函数指针数组
只有函数指针类型都相同的函数才能将他们的地址存放到同一个函数指针数组中
语法结构:返回类型 ( * 数组名 [ 数组长度 ] ) ( 参数类型1,参数类型2 ) ;
声明
int (*pf[3])(int, int);定义
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);// 初始化函数指针数组
int (*funcArray[3])(int, int) = {add, sub, mul};
相关文章:
C语言-指针(二)
一级指针 一级指针指的是存储了变量地址的指针 一级指针的变量类型是 类型 * 一级指针的类型与变量的类型有些不同 例:int * p 前面的int * 是该地址的类型 int a 0; int * p a; 这里的指针 p 就是一级指针 二级指针 指针变量也是变量因此也会有地…...
React 组件prop添加类型
给函数的props做注解 import { useState } from reacttype Props { className:string,title?:string } // 自定义一个Button组件 function Button(props:Props){// 解构出classname\const {className} propsreturn <button className{className}>点击我</button&g…...
Spring Boot中集成Guava Cache或者Caffeine
一、在Spring Boot(1.x版本)中集成Guava Cache 注意: Spring Boot 2.x用户:优先使用Caffeine,性能更优且维护活跃。 1. 添加依赖 在pom.xml中添加Guava依赖: <dependency><groupId>com.google.guava</groupId&…...
全感官交互革命:当 AI 大模型学会 “看、听、说、创”
引言:从 “文字对话” 到 “全感官体验”,AI 正在重塑人类认知边界 当 AI 不再局限于文本对话,而是能 “看懂” 图像、“听懂” 语音、“生成” 视频,并将这些模态无缝融合时,一场关于人机交互的革命已然开启。DeepSe…...
Linux 库文件详解
Linux 库文件详解 一、库文件概述 库文件是预先编译好的方法的集合,它为程序员提供了一种方便的方式来复用代码。在 Linux 系统中,主要有两种类型的库文件:静态库和共享库。 静态库(.a 文件) 使用静态库࿰…...
蒙特卡罗方法(Monte Carlo Method):基于随机采样的数值计算与模拟技术
核心思想 蒙特卡罗方法通过随机采样和统计模拟解决数学、物理、工程等领域的复杂问题,其核心是利用大数定律——当样本量足够大时,样本均值会收敛于期望值。 关键特点: 无维度诅咒&#x…...
HTTPS协议:更安全的HTTP
目录 1. 前言 2. HTTP 与 HTTPS:安全的分水岭 2.1 HTTP 的安全隐患 2.2 HTTPS 的安全提升 3. HTTPS 的核心概念 3.1 加密三剑客:对称加密、非对称加密与哈希算法 3.2 SSL/TLS 握手过程:建立安全通道的关键步骤 3.3 数字证书ÿ…...
Flutter BottomNavigationBar 详解
目录 一、引言 二、BottomNavigationBar 的基本用法 三、主要属性 1. 基本配置 2. 导航项配置 3. 导航类型选择 四、高级功能实现 1. 结合 PageView 实现滑动切换 2. 添加徽章提示 3. 自定义凸起按钮(FAB融合) 4. 渐变背景实现 五、自定义 B…...
吴恩达深度学习作业 RNN模型——字母级语言模型
一. 简单复习一下RNN RNN RNN适用于处理序列数据,令是序列的第i个元素,那么就是一个长度为的序列,NLP中最常见的元素是单词,对应的序列是句子。 RNN使用同一个神经网络处理序列中的每一个元素。同时,为了表示序列的…...
数字时代,如何为个人信息与隐私筑牢安全防线?
首席数据官高鹏律师团队编著 在当今数字化时代,个人信息和隐私保护至关重要。我们在享受数字生活带来的便利时,也面临着个人信息泄露、隐私被侵犯的风险。下面将从先进技术和法律途径两个方面,探讨如何严格保护个人信息和隐私。 一、先进技…...
javascript交换值最好三种
代码 1. 位运算(性能高,但只能用于整数) var a15; var b32; console.log(a) //15 console.log(b) //32 a a ^ b; b a ^ b; a a ^ b; console.log(a) //32 console.log(b) //152. 数组结构(性能高,但要ES6) var a15; var b32; console.log(…...
C++-Lambda表达式
目录 1.什么是 Lambda? 2.例子:打印每个元素(和 for_each 一起用) 3.捕获外部变量(Capture) 3.1. 捕获值(拷贝):[] 3.2. 捕获引用:[&] 3.3. 指定捕…...
逻辑回归的多分类实战:以鸢尾花数据集为例
文章目录 引言:从二分类到多分类一、多分类问题无处不在二、One-vs-All策略揭秘1. 核心思想2. 数学表达 三、鸢尾花分类完整实现1. 环境准备2. 数据加载与探索3. 数据预处理4. 模型训练与评估5. 决策边界可视化 四、关键参数解析五、总结 引言:从二分类到…...
[面试]SoC验证工程师面试常见问题(一)
SoC验证工程师面试常见问题(一) 摘要:在面试 SoC 验证工程师职位时,面试官通常会重点考察候选人对 SystemVerilog 和 UVM (Universal Verification Methodology) 的掌握程度,因为这两者是现代 IC 验证的核心技能。以下是可能会被问到的常见问题,涵盖 SystemVerilo…...
传统银行服务和 区块链支付无缝融合的一种解决方案
Dragonfly Capital 的合伙人 Alex Pack 曾表示:“DeFi 的目标是重构全球银行体系,并打造开放且无须许可的经营环境。”在 DeFi 的金融世界中,加密资产架构在区块链上,通过各个协议实现资产之间的高效转移和价值的实时流通,如 Metamask 钱包的自托管,Uniswap 的资产交易,…...
大语言模型能力评定探讨
有标准答案的评估(选择题) 评估语言模型能力的基本思路是准备输入和标准答案,比较不同模型对相同输入的输出 由于AI答题有各种各样答案,因此现在是利用选择题考察。 有一个知名的选择题的基准叫做Massive Multitask Language Und…...
解构区块链身份认证:从ID到零知识证明的实战指南
引言 在数字经济高速发展的今天,数字身份已成为个人与数字世界交互的核心凭证。传统中心化身份系统存在数据孤岛、隐私泄露、单点故障等痛点,而区块链技术凭借去中心化、不可篡改、可追溯的特性,为数字身份验证提供了革命性解决方案…...
IntelliJ IDEA 使用教程
文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 一、创建项目 二、创建模块 【File】->【New】->【Module…】 三、创建包 【helloword】->【右击 src】->【New】->【Package】 四、创建类 【helloword】->【s…...
HBM的哪些事
命令操作 这也许是DDR往HBM演进的一些奇淫技巧。 本篇内容属于杂谈,关于HBM的奇淫技巧,随后出专题介绍。...
C++ std::initializer_list 详解
std::initializer_list 是 C11 引入的一个轻量级模板类,用于支持花括号初始化列表({1, 2, 3})的语义。它允许函数或构造函数接受任意长度的同类型初始化列表,是实现统一初始化({} 语法)的核心组件。 1. 基本…...
网络原理 - 13(HTTP/HTTPS - 4 - HTTPS)
目录 HTTPS 是什么 不得不的策略 - 应对“运营商劫持” “加密” 是什么 分类 对称加密 非对称加密 HTTPS 工作原理 1)引入对称加密 2) 引入非对称加密 中间人攻击 引入证书 证书的验证过程 完! HTTPS 是什么 HTTPS 也是一个应…...
当MCP撞进云宇宙:多芯片封装如何重构云计算的“芯“未来?
当MCP撞进云宇宙:多芯片封装如何重构云计算的"芯"未来? 2024年3月,AMD发布了震撼业界的MI300A/B芯片——这颗为AI计算而生的"超级芯片",首次在单封装内集成了13个计算芯片(包括3D V-Cache缓存、CDNA3 GPU和Zen4 CPU),用多芯片封装(Multi-Chip Pac…...
Kotlin Flow流
一 Kotlin Flow 中的 stateIn 和 shareIn 一、简单比喻理解 想象一个水龙头(数据源)和几个水杯(数据接收者): 普通 Flow(冷流):每个水杯来接水时,都要重新打开水龙头从…...
虚拟局域网(VLAN)实验(Cisco Packet Tracer)-路由器、交换机的基本配置
好的,我们来根据你提供的文档,一步步地在 Cisco Packet Tracer 中完成这个跨交换机划分 VLAN 的实验。 实验目标: 配置两台交换机 SW1 和 SW2,划分 VLAN 10 和 VLAN 20,配置 Trunk 链路,并测试同 VLAN 和跨 VLAN 的连…...
【论文速递】2025年09周 (Robotics/Embodied AI/LLM)
目录 LLM-Microscope:揭示标点符号在Transformers的上下文中的隐藏作用英文摘要中文摘要 SurveyX:通过大型语言模型实现学术调查自动化英文摘要中文摘要 数学推理的自我奖励校正英文摘要中文摘要 VideoGrain:调整时空关注以进行多元透明视频编…...
自主机器人模拟系统
一、系统概述 本代码实现了一个基于Pygame的2D自主机器人模拟系统,具备以下核心功能: 双模式控制:支持手动控制(WASD键)和自动导航模式(鼠标左键设定目标) 智能路径规划:采用改进型…...
DeepSeek构建非农预测模型:量化关税滞后效应与非线性经济冲击传导
AI分析:非农数据前瞻与关税影响的滞后性 根据AI模型对多维度经济指标的交叉验证,4月非农就业报告或呈现“增速放缓但未失速”的特征。当前市场共识预期为新增就业13.3万人(前值22.8万),失业率维持4.2%,时薪…...
前端面经-VUE3篇--vue3基础知识(一)插值表达式、ref、reactive
一、计算属性(computed) 计算属性(Computed Properties)是 Vue 中一种特殊的响应式数据,它能基于已有的响应式数据动态计算出新的数据。 计算属性有以下特性: 自动缓存:只有当它依赖的响应式数据发生变化时ÿ…...
云原生后端架构的优势与最佳实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 在过去的几年里,随着云计算和容器化技术的迅猛发展,云原生架构逐渐成为现代企业和开发团队构建和运维应用系统的首选方式。云原生架构通过高度的自动化、弹性伸缩、微服务化等特点,使得企业能够在不断变化…...
力扣838.推多米诺随笔
“生活就像海洋,只有意志坚强的人,才能到达彼岸。”—— 马克思 题目 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。 每过一秒,倒向左边的多米诺骨牌会推动其左侧…...
aab转apk
一、 android34升级: 1、升级到安卓34(蓝牙、图片) 再蓝牙广播的地方加入Context.RECEIVER_EXPORTED 2、废弃了 BluetoothAdapter#enable() 和 BluetoothAdapter#disable(),需要修改 // 以前的蓝牙操作BluetoothManager bluetoo…...
LeetCode 560. 和为 K 的子数组 | 前缀和与哈希表的巧妙应用
文章目录 方法思路:前缀和 哈希表核心思想关键步骤 代码实现复杂度分析示例解析总结 题目描述 给定一个整数数组 nums 和一个整数 k,请统计并返回该数组中和为 k 的子数组的数量。 子数组是数组中连续的非空元素序列。 示例 输入:nums …...
【Hive入门】Hive性能调优:小文件问题与动态分区合并策略详解
目录 引言 1 Hive小文件问题概述 1.1 什么是小文件问题 1.2 小文件产生的原因 2 Hive小文件合并机制 2.1 hive.merge.smallfiles参数详解 2.2 小文件合并流程 2.3 合并策略选择 3 动态分区与小文件问题 3.1 动态分区原理 3.2 动态分区合并策略 3.3 动态分区合并流程…...
基于Springboot+Vue3.0的前后端分离的个人旅游足迹可视化平台
文章目录 0、前言1、前端开发1.1 登录注册页面1.2 首页1.3 足迹管理1.3.1 足迹列表1.3.2 添加足迹1.4 个人中心1.4.1 足迹成就1.4.2 个人信息1.4.3 我的计划2、后端开发2.1 用户接口开发2.2 足迹点接口2.3 旅游计划接口3、完整代码资料下载0、前言 项目亮点: 前端用户权限动态…...
安妮推广导航系统开心版多款主题网址推广赚钱软件推广变现一键统计免授权源码Annie
一、源码描述 这是一套推广导航源码(Annie),基于Funadmin框架(ThinkPHP8Layui ),内置多款主题,可以用于网址推广,或者用于软件推广,PC端软件手机端软件,后台…...
单片机-STM32部分:1、STM32介绍
飞书文档https://x509p6c8to.feishu.cn/wiki/CmpZwTgHhiQSHZkvzjdc6c4Yn1g STM32单片机不是一款芯片,而是一个系列的芯片? STM32系列单片机是ST(意法半导体)公司开发的一套32位微控制器基于Arm Cortex()-M处理器,它包…...
PHP-session
PHP中,session(会话)是一种在服务器上存储用户数据的方法,这些数据可以在多个页面请求或访问之间保持。Session提供了一种方式来跟踪用户状态,比如登录信息、购物车内容等。当用户首次访问网站时,服务器会创…...
php artisan resetPass 执行密码重置失败的原因?php artisan resetPass是什么 如何使用?-优雅草卓伊凡
php artisan resetPass 执行密码重置失败的原因?php artisan resetPass是什么 如何使用?-优雅草卓伊凡 可能的原因 命令不存在:如果你没有正确定义这个命令,Laravel 会报错而不是提示”重置密码失败”用户不存在:’a…...
AI大模型-微调和RAG方案选项
在搭建知识库的方向上,有两个落地方案:微调、RAG。两个方案的比对: 方案选型 微调 让大模型(LLM)去学习现有知识(调整大模型的参数,让它学习新的知识),最终生成一个新的…...
MySQL 第一讲---基础篇 安装
前言: 在当今数据驱动的时代,掌握数据库技术已成为开发者必备的核心技能。作为全球最受欢迎的开源关系型数据库,MySQL承载着淘宝双十一每秒50万次的交易请求,支撑着Facebook百亿级的数据存储,更是无数互联网企业的数据…...
【JavaScript-Day 1】从零开始:全面了解 JavaScript 是什么、为什么学以及它与 Java 的区别
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
C++ 复习
VS 修改 C 语言标准 右键项目-属性 输入输出 //引用头文件,用<>包裹起来的一般是系统提供的写好的代码 编译器会在专门的系统路径中去进行查找 #include <iostream> //自己写的代码文件一般都用""包裹起来 编译器会在当前文件所在的目录中査…...
数字智慧方案5877丨智慧交通项目方案(122页PPT)(文末有下载方式)
篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/2301_78256053/89575494 资料解读:智慧交通项目方案 详细资料请看本解读文章的最后内容。 智慧交通项目方案是一个全面的设计框架,…...
如何封装一个线程安全、可复用的 HBase 查询模板
目录 一、前言:原生 HBase 查询的痛点 (一)连接管理混乱,容易造成资源泄露 (二)查询逻辑重复,缺乏统一的模板 (三)多线程/高并发下的线程安全性隐患 (四…...
VLM Qwen2.5VL GRPO训练微调 EasyR1 多机多卡训练(2)
在之前博客进行了简单的训练尝试:https://www.dong-blog.fun/post/2060 在本博客,将会深入进行多机多卡训练,以及调整训练奖励函数。 之前构建了镜像: docker build . -t kevinchina/deeplearning:r1 FROM hiyouga/verl:ngc-th2.6.0-cu126-vllm0.8.4-flashinfer0.2.2-cx…...
基于建造者模式的信号量与理解建造者模式
信号量是什么? AI解释:信号量(Semaphore)是操作系统中用于 进程同步与互斥 的经典工具,由荷兰计算机科学家 Edsger Dijkstra 在 1965 年提出。它本质上是一个 非负整数变量,通过原子操作(P 操作…...
笔试专题(十四)
文章目录 mari和shiny题解代码 体操队形题解代码 二叉树中的最大路径和题解代码 mari和shiny 题目链接 题解 1. 可以用多状态的线性dp 2. 细节处理:使用long long 存储个数 3. 空间优化:只需要考虑等于’s’,‘sh’,shy’的情况…...
2025年五一数学建模A题【支路车流量推测】原创论文讲解
大家好呀,从发布赛题一直到现在,总算完成了2025年五一数学建模A题【支路车流量推测】完整的成品论文。 给大家看一下目录吧: 摘 要: 一、问题重述 二.问题分析 2.1问题一 2.2问题二 2.3问题三 2.4问题四 2.5 …...
Linux系统:进程程序替换以及相关exec接口
本节重点 理解进程替换的相关概念与原理掌握相关程序替换接口程序替换与进程创建的区别程序替换的注意事项 一、概念与原理 进程程序替换是操作系统中实现多任务和资源复用的关键机制,允许进程在运行时动态加载并执行新程序。 1.1 定义 进程程序替换是指用新程…...
STM32复盘总结——芯片简介
1、stm32介绍 STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器 STM32常应用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等 STM32功能强大、性能优异、片上资源丰富、功耗低,是一款经典的嵌入式微控制器 目…...