二级指针略解【C语言】
以int** a为例
1.二级指针的声明
-
a是一个指向int*(指向整型的指针)的指针,即二级指针。 -
通俗的讲,a是一个指向指针的指针,对a解引用会是一个指针。
-
它可以用于操作动态分配的二维数组、指针数组或需要间接修改指针的场景。
2.动态二维数组的表示
-
例如动态分配一个
N×M的二维数组:int** a =(int**)malloc(N*sizeof(int*));for(int i=0;i<N;i++){*(a+i)=(int*)malloc(M*sizeof(int));//a[i]=(int*)malloc(M*sizeof(int));}3.函数参数传递
-
当二级指针作为函数参数传递是,有以下几种意思:
-
1.作为指针数组使用:
-
void example(int** a,int size){for(int i=0;i<size;i++){a[i]=NULL;//初始化} }2.作为二维数组使用:
-
void example(int** a,int size,int* aColSize){for(int i=0;i<size;i++){for(int j=0;j<aColSize[i];j++){a[i][j]=0;//初始化}} }3.作为传回的指针使用:
-
void example(int** a){*a=NULL; }和这段代码是一样的作用:
-
int* example(int* a){a=NULL;return a; }注意:
-
1.混淆二维数组和二级指针
-
虽然二级指针作为函数参数传递可以作为二维数组使用,但不能将二维数组作为二级指针接收的参数使用!
-
例如以下是错误做法:
-
#include<stdio.h> void example(int** a,int size,int* aColSize){for(int i=0;i<size;i++){for(int j=0;j<aColSize[i];j++){a[i][j]=0;//初始化}} } int main() {int a[10][10],size=10,aColSize[10];for(int i=0;i<10;i++){aColSize[i]=10;for(int j=0;j<10;j++){scanf("%d",&a[i][j]);}}example(a,size,aColSize);//错误:企图将二维数组作为二级指针接收的参数 return 0; }正确做法应该这样做:
-
#include<stdio.h> #include<stdlib.h> void example(int** a, int size, int* aColSize) {for (int i = 0; i < size; i++) {for (int j = 0; j < aColSize[i]; j++) {a[i][j] = 0; //初始化printf("%d_%d ", i, j);}} } int main() {int *a[10], size = 10, aColSize[10];for (int i = 0; i < size; i++) {a[i] = (int*)malloc(10*sizeof(int));}for (int i = 0; i < size; i++) {aColSize[i] = size;for (int j = 0; j < size; j++) {scanf("%d", &a[i][j]);}}example(a, size, aColSize);for(int i=0;i<size;i++){free(a[i]);}return 0; }千万不要写成以下这样,虽然编译器可能不会报错,但向野指针指向的区域赋值是不可取的,程序会崩溃的。
-
#include<stdio.h> #include<stdlib.h> void example(int** a, int size, int* aColSize) {for (int i = 0; i < size; i++) {for (int j = 0; j < aColSize[i]; j++) {a[i][j] = 0; //初始化printf("%d_%d ", i, j);}} } int main() {int *a[10], size = 10, aColSize[10];//a数组未初始化for (int i = 0; i < size; i++) {aColSize[i] = size;for (int j = 0; j < size; j++) {scanf("%d", &a[i][j]);}}example(a, size, aColSize);return 0; } -
二级指针用来作为动态二维数组时,分配的内存是不连续的,但静态分配的二维数组在内存上是连续的!因此,也不能将静态二维数组的首元素地址赋给二级指针!
-
以下是错误示例:
-
int arr[3][4];int **p = (int**)arr; // ❌ 编译通过但运行崩溃2.动态内存释放
-
虽然程序一般在运行结束后会自动释放所用内存,但为保证程序长时间运行内存足够,因此用malloc等函数动态分配的内存在使用后要释放!一般称其为避免内存泄漏。养成用完释放的好习惯,避免工作时的项目出错。
-
但内存释放对于二级指针一定要有先后顺序:
-
以下是错误示范1:
-
void example(){int N,M;scanf("%d %d",&N,&M);int** a=(int**)malloc(N*sizeof(int*));for(int i=0;i<N;i++){a[i]=(int*)malloc(M*sizeof(int));}free(a);//只释放了a数组,但未释放a+i(0<i<10)这些数组! }以下是错误示范2:
-
void example(){int N,M;scanf("%d %d",&N,&M);int** a=(int**)malloc(N*sizeof(int*));for(int i=0;i<N;i++){a[i]=(int*)malloc(M*sizeof(int));}free(a);for(int i=0;i<N;i++){free(a[i]);//由于a数组的内存已经释放,a[i]的指针信息丢失,无法释放内存!} }以下是正确示例:
-
void example(){int N,M;scanf("%d %d",&N,&M);int** a=(int**)malloc(N*sizeof(int*));for(int i=0;i<N;i++){a[i]=(int*)malloc(M*sizeof(int));}for(int i=0;i<N;i++){free(a[i]);}free(a); } -
关键要点总结
-
✅ 二级指针本质:指向指针的指针
-
✅ 正确使用场景:动态多维数组、需间接修改指针
-
⚠️ 常见错误:混淆静态/动态内存布局、未初始化指针
-
🔧 最佳实践:分配后立即初始化、使用完毕及时释放
相关文章:
二级指针略解【C语言】
以int** a为例 1.二级指针的声明 a 是一个指向 int*(指向整型的指针)的指针,即二级指针。 通俗的讲,a是一个指向指针的指针,对a解引用会是一个指针。 它可以用于操作动态分配的二维数组、指针数组或需要间接修改指针…...
鸿蒙状态管理概述
状态管理 状态管理之v1LocalStorageLocalStorageLink的框架行为LocalStorageProp的框架行为LocalStorage使用场景 AppStorageStorageLink的框架行为StorageProp的框架行为AppStorage的使用场景 PersistentStorageEnvironmentEnvironment内置参数 WatchWatch的使用场景 $$语法$$…...
【核心算法篇十三】《DeepSeek自监督学习:图像补全预训练方案》
引言:为什么自监督学习成为AI新宠? 在传统监督学习需要海量标注数据的困境下,自监督学习(Self-Supervised Learning)凭借无需人工标注的特性异军突起。想象一下,如果AI能像人类一样通过观察世界自我学习——这正是DeepSeek图像补全方案的技术哲学。根据,自监督学习通过…...
由浅入深学习大语言模型RLHF(PPO强化学习- v1浅浅的)
最近,随着DeepSeek的爆火,GRPO也走进了视野中。为了更好的学习GRPO,需要对PPO的强化学习有一个深入的理解,那么写一篇文章加深理解吧。纵观网上的文章,要么说PPO原理,各种复杂的公式看了就晕,要…...
网络安全三件套
一、在线安全的四个误解 Internet实际上是个有来有往的世界,你可以很轻松地连接到你喜爱的站点,而其他人,例如黑客也很方便地连接到你的机器。实际上,很多机器都因为自己很糟糕的在线安全设置无意间在机器和系统中留下了“…...
瑞芯微RV1126部署YOLOv8全流程:环境搭建、pt-onnx-rknn模型转换、C++推理代码、错误解决、优化、交叉编译第三方库
目录 1 环境搭建 2 交叉编译opencv 3 模型训练 4 模型转换 4.1 pt模型转onnx模型 4.2 onnx模型转rknn模型 4.2.1 安装rknn-toolkit 4.2.2 onn转成rknn模型 5 升级npu驱动 6 C++推理源码demo 6.1 原版demo 6.2 增加opencv读取图片的代码 7 交叉编译x264 ffmepg和op…...
【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑤】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase05 作者:车端域控测试工程师 更新日期:2025年02月15日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-005测试用例 用例ID测试场景验证要点参考条款预期…...
python-leetcode 35.二叉树的中序遍历
给定一个二叉树的根节点root,返回它的中序遍历。 方法一:递归 二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过…...
glob 用法技巧
目录 处理大量文件节省内存 匹配多个文件扩展名 遍历多种格式文件 遍历某一个文件: 查找当前目录和子目录 6. 排除特定文件 7. 大小写不敏感匹配 8. 获取绝对路径 9. 处理特殊字符 处理大量文件节省内存 技巧:用 iglob 替代 glob,逐…...
CodeGPT 使用教程(适用于 VSCode)
CodeGPT 使用教程(适用于 VSCode) CodeGPT 是一个 VSCode 插件,可以让你在代码编辑器中直接调用 GPT 进行代码补全、优化、调试等操作。以下是详细的安装和使用步骤: 1. 安装 CodeGPT 方式 1:从 VSCode 插件市场安装…...
以下是MySQL中常见的增删改查语句
以下是MySQL中常见的增删改查语句: 增加数据(INSERT) 基本语法: INSERT INTO table_name (column1, column2,...) VALUES (value1, value2,...); 示例:向名为 students 的表中插入一条学生记录, id 为1&am…...
Vue3 与 TypeScript 实战:核心细节与最佳实践
引言 Vue3 的 Composition API 与 TypeScript 的强类型支持完美契合,极大提升了代码的可维护性和开发体验。本文将深入探讨 Vue3 TypeScript 的关键细节,并通过实际代码示例展示如何高效结合二者。 一、组合式 API 与类型推导 Vue3 的 setup 函数与 T…...
23种设计模式 - 解释器模式
模式定义 解释器模式(Interpreter Pattern)是一种行为型设计模式,用于为特定语言(如数控系统的G代码)定义文法规则,并构建解释器来解析和执行该语言的语句。它通过将语法规则分解为多个类,实现…...
常用的 React Hooks 的介绍和示例
目录 1. useState2. useEffect3. useContext4. useReducer5. useCallback6. useMemo7. useRef8. useImperativeHandle9. useLayoutEffect10. useDebugValue 常用的 React Hooks 的介绍和示例: 1. useState useState 是一个用于在函数组件中添加状态的 Hook。 impo…...
ChatGLM-6B模型
ChatGLM-6B 是由 清华大学人工智能研究院(THU AI) 和 智源研究院(BAAI) 开发的一款中文对话生成大语言模型。它是ChatGLM系列的一个版本,其核心特点是基于GLM(General Language Model)架构&…...
编译安装php
前置准备 这里的可能不全,每个人安装的模块不一致,依赖也不不相同,按实际情况调整 yum install libxml2 -y yum install libxml2-devel -y yum install openssl-devel -y yum install sqlite-devel -y yum install libcurl-devel -yyum ins…...
【JavaEE进阶】Spring MVC(3)
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗 如有错误,欢迎指出~ 返回响应 返回静态页面 //RestController Controller RequestMapping("/response") public class ResponseController {RequestMapping("/returnHtmlPage&…...
30 款 Windows 和 Mac 下的复制粘贴软件对比
在日常电脑操作中,复制粘贴是极为高频的操作,一款好用的复制粘贴软件能极大提升工作效率。以下为你详细介绍 30 款 Windows 和 Mac 下的复制粘贴软件,并对比它们的优缺点,同时附上官网下载地址,方便大家获取软件。 Pa…...
【LLAMA】羊驼从LLAMA1到LLAMA3梳理
every blog every motto: Although the world is full of suffering, it is full also of the overcoming of it 0. 前言 LLAMA 1到3梳理 1. LLAMA 1 论文: LLaMA: Open and Efficient Foundation Language Models 时间: 2023.02 1.1 前言…...
【OS安装与使用】part3-ubuntu安装Nvidia显卡驱动+CUDA 12.4
文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 更改镜像源2.2.2 安装NVIDIA显卡驱动:nvidia-550(1)查询显卡ID(2)PCI ID Repository查询显卡型号(3…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
