C之二级指针

详解C语言中的二级指针 在C语言中,二级指针是指一个指向指针的指针,用于指向一个指针的地址。数据类型 **变量名;其中,数据类型为指针类型,变量名为二级指针变量的名称。本篇文章详细介绍了二级指针的定义、计算规则、读写操作以及取地址操作。通过掌握二级指针的使用,C语言程序员可以更加灵活地操作多级数据结构,并提高程序的执行效率和可读性。 阅读详情

1 一级指针

每8个bit,也就是1个字节,对应一个地址,也就是地址的最小单位是字节。
一级指针指向的内容一定是一个“地址”,而不是普通变量。

int a = 10;
int *p1;

p1 = &a;
上面的代码,我们没有在定义*p1的时候直接初始化赋值,而是在 下一行进行赋值,这说明了一个容易忽略的细节,那就是:

一级指针本身p1本身也是一个变量,它跟 a 是 一样的,只不过指向的内容不同而已,a指向的是一个具体的值,而p1则是指向a的内存地址。

我们对p1的赋值和各种其他操作(不带*),都是伴随着“内存地址”的。

指针指向的内容是个“内存地址”,指针本身也是一个变量,而不管是一级指针、二级指针 还是多级指针。内存只有一块,所有的 指针本身,也会分配一个内存地址,用于存放指针内容。

2 二级指针

2.1 二级指针基本概念

二级指针也是一个变量,它 指向的一定是“指针的地址”。对比下,一级指针指向的是普通变量的地址,二级指针指向的是“一级指针的地址”,以此类推,三级指针对应的是“二级指针的地址”。

2.2 二级指针的使用

2.2.1 函数的传值调用和传址调用

C中函数一般都有形参,当然也有形参为void的函数,对于那些有形参的函数,我们在调用的时候,就涉及到参数的传递,我们常见的参数有2种,一种是标准变量参数,比如int、char、结构体等单独变量,另一种就是指针,指针可以是一级指针,也可以是多级指针。
1)传值调用
函数的参数是标量参数,我们在调用函数,给函数传递参数时,是按照“传值调用”来运行函数的,这意味着函数将获得函数值的一份“拷贝”,注意这里说的是拷贝,这意味着我们可以放心的修改这个拷贝值,而不必担心会修改调用程序实际传递给他的参数。
2)传址调用
指针也是一个“值”,跟标准变量是一样的,只不过这个“值”规定好了,一定是一个“地址”,我们只能对地址进行简单的加减操作,多数情况下,我们通过对该地址值进行 引用操作,获取这个地址里的内容,所以,我们调用参数为指针的函数时,传递给函数的也是这个指针地址的拷贝,也就是所谓的“传递地址调用”。

void func(int *a)
{
   *a = *a + 1;   
}
 
int main(void)
{
    int a = 5;
    func(&a);
}

尽管在调用函数时,我们传入的是一个地址的值的拷贝,但是对“地址”的操作,就不是函数局部操作了,而是针对整个内存区域了,所以对该地址的间接操作(*)就是对这个地址指向的内存区域进行读写,所以这次的调用会改变a的值。

2.2.2 二级指针的作为函数形参

二级指针作为形参,往往是为了获取一个特定“地址”,是想要通过形参获取地址。这里可能会有些疑问,如果想要获取地址,那么直接将函数 返回值设定为指针型就可以啊,这 当然是可以的,但是还有一种 情况,比如我们想要获取多个特定地址,这个时候就需要使用二级指针了,比如我们想要我们想要从一串字符串中查找指定字符串,返回查找的字符串位置指针,同时在形参中也要返回(这么绕的目的是为了方便理解,)我们先给出错误的程序代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 
typedef unsigned char u8;
 
/*----------  错误的使用案例!!!   -----------------*/
u8 *func(u8 *src,u8 *cstr, u8 *str)
{
	printf("before call str:%d\n", str);
	str = strstr(src, cstr);
	printf("end call str:%d\n", str);
	return strstr(src, cstr);
}
 
 
int main(int argc, char *argv[]) {
	
	u8 *src = "abcdefg123ef";
	u8 *cstr = "cde";
	u8 *str1 = NULL;
	u8 *str2 = NULL ;
	
	str1 = func(src, cstr, str2);
	
	printf("str1:%s\n", str1);
	
	printf("str2:%s\n", str2);
	
	return 0;
}

程序执行结果如下:

before call str:0
end call str:4210727
str1:cdefg123ef
str2:(null)

这个错误的使用案例, func函数调用strstr库函数函数,返回值作为函数返回值,这样使用时没有问题的,但是如果我们将strstr的返回值赋值给str,那么就有问题了,原因如下:

调用func时,对于一级指针str,会进行“传址调用”,也就是我们会拷贝一个一模一样的数值到func中,而且本质上,指针 并不是什么特殊的东西,它也只是一个普通的变量,只不过这个变量里的内容是地址,这就相当于我们给一个拷贝后的值赋值一样,对原变量是没有任何改变的,所以我们在调用后,作为形参的str,内容并没有什么改变,当然如果想要改变,只需要对指针进行间接引用即可,为什么 间接引用可以呢?因为间接引用是通过拷贝的地址,读写地址指向的内容。

那么如何正确实现开头想要的目的呢?答案是,使用二级指针,正确的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned char u8;
u8 *func(u8 *src,u8 *cstr, u8 **str)
{
	printf("end call *str:%d\n", *str);
	*str = strstr(src, cstr);
	printf("end call *str:%d\n", *str);
	return strstr(src, cstr);
}
 
int main(int argc, char *argv[]) {
	
	u8 *src = "abcdefg123ef";
	u8 *cstr = "cde";
	u8 *str1 = NULL;
	u8 *str2 = NULL ;
	
	printf("src addr:%d\n", src);
	
	str1 = func(src, cstr, &str2);

	printf("str1:%s\n", str1);
	
	printf("str2:%s\n", str2);
	
	return 0;
}

程序运行结果:

src addr:4210706
end call *str:0
end call *str:4210708
str1:cdefg123ef
str2:cdefg123ef

为什么使用二级指针就可以正确实现呢? 我们知道,一级指针 存放的是变量的地址,而二级指针存放的是一级指针的地址,而不管是几级指针,函数的调用,都是“传址调用”,所以假如形参是二级指针, 我们传入是二级指针的拷贝值,而二级指针的值是一级指针的地址,所以在上面的函数中,我在调用func函数时,一定是传入一级指针的地址,这是个巧妙的地方,不要直接定义一个二级指针,而是定义一级指针,传入一级指针的地址。

然后我们在函数内部,就可以对这个二级指针进行赋值,赋值为一个地址,这就相当于间接操作,我们不要直接给一级指针赋值,而是通过这个一级指针的地址间接给这个 一级指针赋值,这样很显然是合理巧妙的。

所以,归根结底,要特别留意,不要忽略掉函数引用的“传值调用” 和“传址调用”的前提。也 就是拷贝而非直接使用。

【C语言】深入理解二级指针 文章目录(一)指针的定义(二)引入二级指针(三)深入理解二级指针(1)下面举个例子:(2)在(1)的前提下,那要是把所有的类型换成char、short、double类型呢(四)总结 (一)指针的定义 一级指针:是一个指针变量,指向一个普通变量,并保存该普通变量的地址; 二级指针:是一个指针变量,指向一个一级指针,并保存该一级指针的地址; (二)引入二级指针 由于一级指针已经很熟悉,这里不再赘述,这里我们只谈谈二级指针 下面先简单使用一个二级指针看看 #include <stdio.h> i 阅读详情

相关推荐

C语言入门系列:探秘二级指针与多级指针的奇妙世界

二级指针,顾名思义,是指向指针的指针,即一个变量,其类型是指向指针的地址。数据类型** pointerName;这里,表示是一个指向指针的指针,它存储的是一个指针变量的地址。int* p;p = #如上,二级指针变量pp指向的是指针变量p的地址。如上图所示,发现二级指针需要跳2级才能获取普通变量内存中的值,这也是二级指针名称的来源。

epitomizelu的专栏 1799

二级指针的作为函数形参的深入理解

在上一篇文章《C函数的“传值调用”和“传址调用”的深入分析》我们分析了函数参数的使用,对于一级指针,理解起来相对容易,而二级指针参数的理解相对难一些,我们先说一下二级指针作为函数形参的目的。 二级指针作为形参,往往是为了获取一个特定“地址”,没错,就是想要通过形参获取地址。这里可能会有些疑问,如果想要获取地址,那么直接将函数 返回值设定为指针型就可以啊,这 当然是可以的,但是还有一...

猪哥的专栏 7838

C语言中的二级指针做输出

一、二级指针做输入与输出    做输入,主调函数分配内存,被调函数使用;做输出。被调函数分配内存,把运算的结果,以指针做函数参数甩出来。 #define _CRT_SECURE_NO_WARNINGS #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;stdio.h&gt; //求文件中的两段话的长度 //二级指...

愚公求道 2527

C语言指针--二级指针

在之前学习完一级指针后,知道每一个变量都有对应的地址,那一级指针是不是也有地址,一级指针的地址如何存放? 这几个问题就是想要这一章的内容来解决。

恰柠的博客 6803

别再纠结了!手把手教你根据项目需求选对目标检测框架(MMDetection/Detectron2/YOLOv8实战对比)

本文详细对比了三大目标检测框架MMDetection、Detectron2和YOLOv8的适用场景与实战技巧,帮助开发者根据项目需求精准选型。从毕业设计到工业落地,分析不同场景下的核心需求与框架优势,提供决策树和避坑指南,确保技术选型与项目目标高度匹配。

weixin_30342209的博客 554

LoRaWAN数据包分析工具

前言:LoRaWAN的射频数据包是加密的,而且有些字段是某个字节的某几位,看着不是那么直观,因此在某些情况下需要借助工具来分析数据包。 1、安装npm 这个工具是用JavaScript写的,其中用到了一些依赖库,而npm就可以一次性把这些依赖库下载下来,因此我们先要下载安装npm这个工具。 安装:sudo apt install npm 输入y,等待安装完成: 检查是否安装成功:npm -v 说明安装完成。 2、安装LoRa数据包分析工具lora-packet 安装:npm i.

freemote的博客 4630

c语言二级指针的作用,为什么要使用二级指针?

概念提到指针,我们都知道指针是用来存储一个变量的地址。所以,当我们定义了一个指向指针的指针的时候(pointer to pointer),我们也称之为二级指针,那针对于这个二级指针来说,第一级指针存放的是指向的变量的地址,第二级指针存放的是第一级指针的地址。可以用下面这张图表示他们之间的关系。 上图所表达的意思也就是,一级指针变量 ptr1 存放的是 var 变量的地址,二级指针变量 ptr2 存...

weixin_34900419的博客 3335

计算机视觉-深度学习图像检测方法梳理

计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类、目标定位、语义分割、实例分割的区别 a. 图像分类 :给定一张输入图像,图像分类任务旨在判断该图像所属类别; b. 目标定位 :在图像分类的基础上,我们还想知道图像中的目标具体在图像的什么位置,通常是以包围盒的(bounding box)形式; c. 语义分割 :语义分割是目标检测更进阶的任务,目标检测只需要框出每个目

qq_41662991的博客 9953

关于C语言二级指针正确使用总结

关于C语言二级指针正确使用总结 什么是二级指针 C语言中的二级指针其实就是指向指针的指针,指向指针的指针是一种多级间接寻址的形式,或者说是一个指针链。同理可以构建三级或者N级指针,但是一般情况下用不到多级指针,只有二级指针在一些情况中需要使用,以下是二级指针的初始化: 二重指针的示意图 include <stdio.h> int mian(void) { int var;...

qq_41705337的博客 6496

海康威视摄像机SDK二次开发--提取音频保存至文件

由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释 文件结构 其中CameraInfo内容可以参看海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中 HIKSDKSaveRealData中的内容 package ClientDemo; import ClientDemo.CameraInfo; import com.sun.jna.NativeLong; import

RichardoMu的博客 3173

【2026OD新机考】【不定滑窗】20260415-API请求日志去重分析【Py/Java/C++/C/JS/Go六种语言OD真题】【欧弟算法】全网注释最详细分类最全的华子OD真题题解

中找到所有的连续的相同元素,同时统计对应的连续相同元素对应的值的平均值。:当右指针为第一个元素(没有前一个元素),或者右指针对应的元素。某微服务系统的日志监控平台需分析API调用记录,日志含大量。相等,说明当前元素仍然属于同一个相同元素窗口,将当前元素值。中的所有元素均相等,并且计算窗口和情况即可。请实现一个函数,对给定的日志数据去重合并处理。位置,表示开启一个新的窗口,此时需要重置窗口和。,为了优化重复的请求记录,存储和后续分析需对。:对应的响应时间数组(毫秒)。重新置为当前右指针的元素值。

weixin_48157259的博客 112

c语言二级指针有什么作用,C语言中二级指针的实例详解

C语言中二级指针的实例详解C语言中二级指针的实例详解用图说明示例代码:#include int main(int argc, const char * argv[]){//int a = 5;int *p1 = &a;//-打印地址-----地址相同---------------printf("&a = %p\n", &a);//printf("p1 = %p\n", p1...

weixin_39682560的博客 197

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3657

C语言二级指针

在这个例子中, allocateMemory 函数接受一个二级指针 ptr ,通过 *ptr 可以在函数内部修改传入的指针的值,从而为其分配内存。这意味着它存储的是一个指针的地址,而这个指针又指向另一个变量。在C语言中,二维数组在内存中是按行存储的。要使用二级指针,首先需要定义一个一级指针,并为其分配内存,然后将一级指针的地址赋给二级指针。- matrix 是一个二级指针,它指向一个包含 rows 个指针的数组。- ptr1 是一个指向 int 型变量的指针,它指向 num。

2301_81152393的博客 812

python抓取美团外卖的数据(商家、评分、评论)

本文详细介绍了如何使用Selenium和抓取美团外卖的商家、评分和评论数据。我们从基础的爬虫原理入手,分析了美团外卖的网页结构,提出了应对反爬虫机制的策略,并给出了详细的代码实现。通过使用Selenium,我们能够绕过动态加载内容的限制,直接抓取网页中的商家信息和评论。结合多线程和代理池等技术,我们可以进一步提高爬虫效率,并避免IP被封禁。未来,随着爬虫技术的发展,我们可以进一步探索深度抓取、数据清洗和数据分析等高级应用,以实现更智能的网页数据抓取。

2201_76125261的博客 2694

044、手持视频抖动严重?OpenCV 光流 + IMU 融合的电子防抖工程方案

本文探讨了基于OpenCV光流和IMU融合的手持视频电子防抖方案。作者从实际工程经验出发,分析了纯光流和纯IMU方案的局限性,指出时间戳对齐和坐标系标定是关键挑战。文章详细介绍了融合滤波器的实现方法,推荐互补滤波替代卡尔曼滤波,并提出了动态调整融合系数的策略。在光流算法优化方面,建议采用网格化FAST特征点和前后向误差检测。最后分享了运动补偿裁剪策略和多线程流水线设计,强调在嵌入式设备上使用NEON指令优化性能。该方案通过精确的时间同步和传感器融合,有效解决了手持拍摄中的高频抖动问题。

ai技术增长的博客 250

c语言二级指针实现队列,C语言二级指针底层实现

C语言中,Pointers to Pointers,即二级指针。一级指针和二级指针的值都是指向一个内存单元:一级指针指向的内存单元存放的是源变量的值,二级指针指向的内存单元存放的是一级指针的地址。下面,我们通过如下代码展示二级指针的底层实现:#include int main(){int a = 777;int* b = &a;int** c = &b;*b = 888;**c =...

weixin_39970369的博客 399

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C语言中二级指针的作用

C语言中不存在引用,所以当你试图改变一个指针的值的时候必须使用二级指针。   1.当不用指针时,参数传入子函数的过程为值传递,子函数中修改的局部变量的值对原来的实参并没有影响。 2.当用一级指针时,参数传入子函数的过程为地址传递,子函数的实际操作是对指针的操作,那就可以通过子函数中对于实参指针的修改达到修改实参的值的目的。   我们通过传递指针来达到修改一个值

柳婼 の blog 5962

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C语言中的二级指针

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基

m0_50708613的博客 1671

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

c 语言 二级指针,C 语言 二级指针的使用

#include #include typedef struct node Node;struct node {int data;struct node* next;struct node* prev;};Node head;Node* insert(Node* ph, Node* newData){Node** link = &ph;while (*link && (*...

weixin_30567751的博客 164

C:一级指针与二级指针的详解

1.指针和数组 指针是个用来存放地址的变量; &arr表示整个数组; arr数组名表示首元素的地址; 指针解引用即表示指针所指向的内容 比如:char ptr=“abcdef”; ptr; //指针解引用即表示它所指向的内容,即abcdef ptr; //ptr里保存的是字符串的地址 2.一级指针 一级指针就是指指针,里面放的就是元素的地址,我们可以通过访问元素的地址来找到该地址里存放的内...

AngelDg的博客 3468

c语言二级指针的作用,c语言指针中的二级指针示例详解

c语言指针中的二级指针示例详解如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。以下是百分网小编搜索整理的关于c语言指针中的二级指针示例详解,有需要的朋友可以参考一下!想了解更多相关信息请持续关注我们应届毕业生考试网!二级指针的概念首先任何值都有地址,一级指针的值虽然是地址,但这个地址做为一个值亦需要空间来存放,是空间就具有地址,这就是存放地址这一值的空间所具有的地址,二...

weixin_42361283的博客 250

【C语言】二级指针的应用

本文主要描述了二级指针的基本概念,为什么要使用二级指针,以及如何二级指针的用例。

weixin_43949948的博客 1051

计算机二级指针,C语言——二级指针

二级指针的概念首先任何值都有地址,一级指针的值虽然是地址,但这个地址做为一个值亦需要空间来存放,是空间就具有地址,这就是存放地址这一值的空间所具有的地址,二级指针就是为了获取这个地址,一级指针所关联的是其值(一个地址)名下空间里的数据,这个数据可以是任意类型并做任意用途,但二级指针所关联的数据只有一个类型一个用途,就是地址,指针就是两个用途提供目标的读取或改写,那么二级指针就是为了提供对于内存地址...

weixin_33149211的博客 652

C语言指针-二级指针

二级指针的应用与举例,主要是对数组指针的应用进行实际举例

Wx的博客 1214

c 语言二级指针的使用,C 语言 二级指针的使用

#include #include typedef struct node Node;struct node {int data;struct node* next;struct node* prev;};Node head;Node* insert(Node* ph, Node* newData){Node** link = &ph;while (*link && (*...

weixin_29224589的博客 401
上一篇: C之指针函数和函数指针
ldxFashion
博客等级 码龄6年 0粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值