首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C 语言】指针间接赋值 ( 指针作为 函数参数 的意义 | 间接赋值 代码示例 )

文章目录 一、指针作为 函数参数 ( 间接赋值 ) 的意义 二、间接赋值 代码示例 一、指针作为 函数参数 ( 间接赋值 ) 的意义 ---- 调用函数时 , 调用 & 取地址 生成 实参 p , 将...指针变量 p 实参 传递给 函数形参 , 在函数中 借助传入的 指针 可以 实现 与 外部函数 的内存共享 , 在函数中使用 *p 修改内存值 , 可以将 运算结果通过 *p 传递出来 ; 指针 作为...函数参数 , 可以实现 主函数 与 被调用子函数 之间 内存交换 ; 下面是逻辑链 : 指针作函数参数 ( 间接赋值 ) -> 接口封装与设计 -> 模块划分 -> 软件分层 正是因为有了 间接赋值 ,...才能实现 接口封装与设计 , 进而实现了 模块划分 , 最后实现了 软件分层 ; 使用 指针 ( 一级指针 或 多级指针 ) 作为参数 , 可以更加灵活的在 函数中 对 传入的 指针 指向的内存数据...进行处理 , 这些修改 , 可以保留到函数值返回之后 , 这些参数都可以作为返回值使用 ; 使用 指针 ( 一级指针 或 多级指针 ) 作为参数 , 实现了 main 函数 , 与 其它 子函数 之间的

1.2K10

【C++】函数指针 ④ ( 函数指针做函数参数 | 使用函数指针间接调用函数 | 函数指针做参数 | 函数指针类型的本质 | 函数指针做参数意义 )

pFun = add; // 通过函数指针间接调用 add 函数 pFun(7, 8); 如果将 函数指针变量 pFun_add pFun 作为参数 , 传递给函数 , 在函数内部可以调用其它函数..., int); 定义函数 接收 pFun_add 类型的形参作为参数 , 该类型是 函数指针类型 , 也就是 函数接收一个 函数指针类型参数 , 在该函数中调用 函数指针 指向的 函数 ; // 传入函数指针...= add; // 通过函数指针间接调用 add 函数 pFun(7, 8); // 将 函数指针 作为参数传递到函数中 caculate(pFun, 9, 10); // 可以直接将...; 错误处理 : 使用函数指针 , 将错误处理函数作为参数传递给其他函数 , 在发生错误时立即调用适当的错误处理函数 , 无需返回到调用堆栈中的较高层次 ; 二、代码示例 - 函数指针做函数参数 代码示例...; // 通过函数指针间接调用 add 函数 pFun(7, 8); // 将 函数指针 作为参数传递到函数中 caculate(pFun, 9, 10); // 可以直接将 函数名 (

1.5K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    熬夜整理的万字CC++总结(二),值得收藏

    指针作为函数的形参的另一个典型应用是当函数有多个返回值的情形。比如,需要在一个函数中统计一个数组的最大值、最小值和平均值。当然你可以编写三个函数分别完成统计三个值的功能。...= NULL) { printf("p = %s, len = %d\n", p, len); } } 1.4 字符串指针强化 1.4.1 字符串指针做函数参数 1.4.1.1 字符串基本操作...//strlen计算字符串的长度,到'\0'结束 //那么如果我这么写,结果是多少呢?...,并根据参数format字符串来转换并格式化数据。...参数: str:指定的字符串首地址 format:字符串格式,用法和scanf()一样 返回值: 成功:成功则返回参数数目,失败则返回-1 失败: - 1 //1.

    1.3K20

    面试爱问之const关键字

    const修饰字符串常量:字符串常量位于文字常量区(也有文章归类于代码区),本身就不允许被修改,如果没有const的修饰,我们可能会在后面有意无意的修改字符串常量,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止...2、常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。...修饰函数的参数 const修饰参数是为了防止函数体内可能会修改参数原始对象。...因此,有三种情况可讨论: 1、函数参数为值传递: 值传递(pass-by-value)是传递一份参数的拷贝给函数,因此不论函数体代码如何运行,也只会修改拷贝而无法修改原始对象,这种情况不需要将参数声明为...例如:void func(int x)不用写成void func(const int x) 2、函数参数为指针: 指针传递(pass-by-pointer)只会进行浅拷贝,拷贝一份指针给函数,而不会拷贝一份原始对象

    34520

    C - 指针C语言指针的总结

    指针作为函数的参数 如果函数的参数是一个指针,那么就必须要为这个指针传递一个和指针类型相同的普通变量的地址,这个时候,在函数的内部去访问参数指针的变量的时候,其实访问的就是实参变量 指针作为函数的参数...函数的内部可以修改实参变量的值。那么什么时候使用指针作为参数呢?...数组作为函数的参数的本质 当数组作为函数的参数的时候,在声明这个参数数组的时候,并不是去创建一个数组,而是去创建一个用来存储地址的指针变量,如果我们为函数写了一个数组作为参数,其实编译器在编译的时候,...已经把这个数组变成了指针,这也就是为什么我们通过sizeof计算参数数组得到的永远都是8,所以以后我们的函数如果带了一个数组参数,建议直接写一个指向数组的第0个元素的指针,在传入数组的长度 索引的本质...当我们以字符指针的形式存储字符串的时候,无论如何,字符串数据是存储在常量区的,并且,一旦存储到常量去中去,这个字符串数据就无法更改。 2.)

    4.2K81

    深入JVM——OOM异常解析

    a)指针直接访问实例数据 在这种方式中,JVM栈中的栈帧中的本地变量表中所存储的引用地址就是实例数据的地址。通过这个引用就能直接获取到实例数据的地址。...b)使用句柄间接访问实例数据 JVM会在堆中划分一块内存来作为句柄池,JVM栈中的栈帧中的本地变量表中所存储的引用地址是这个对象所对应的句柄地址,而非对象本身的地址。...综上所述:句柄池就相当于一个中转站,我们要查询的实例对象数据需要通过一次间接索引获取;而指针的直接访问无需中转站,引用指向的就是要访问的实例对象数据。...两种对象访问方式的好处 a)句柄访问对象的好处 访问对象通过一个句柄指针一次间接索引之后,当对象实例数据被移动的时候(垃圾回收的时候有些对象会被移动),只需要改变句柄池中该对象实例的地址即可...intern方法的作用是:当常量池中已经有这个String类型所对应的字符串的话,就返回这个字符串的引用;如果常量池中没有这个字符串的话就将这个字符串添加到常量池中,再返回这个字符串的引用。

    1K110

    C++|对象模型|对象模型综述

    作为C++的核心单元,对象模型在编译器眼中是如何实现的?本文从几个基本理论模型出发,剖析实际。 深度探索C++对象模型 ---- 简单对象模型 对象存放若干slots,由slot指向实际成员。...members按声明顺序 简单对象模型 优点:对象大小等于指针数*成员数,并且取出成员时,只需要根据slot索引获取指针即可。编译器实现简单。 缺点:存在间接层,时空效率降低。...,也可以指向非虚函数,如何寻址?...优点:函数表作为整体被分离出类,而内部的指针又提供了灵活性,为其成为虚表打下基础 缺点:过度设计导致间接层暴增。.../虚函数实例的地址 实现:typeinfo/虚表指针 虚表作为class的一员不参与object级的多态(不懂请把OOP抄一万遍),因此编译期即可决议虚函数的地址。

    68010

    深入解析C语言数组和指针(0)

    函数指针最常见的用途是把函数指针作为参数传递给函数以及用于转换表。...作为函数参数的数组名 通过前面的学习我们知道,数组名的值就是指向数组第一个元素的指针。所以当一个数组名作为参数传递给一个函数时,此时传递给函数的是一份该指针的拷贝。...所以函数一颗自由的操纵它的指针形参,而不必担心会修改对应的作为实参的指针。但是也可以通过形参改变数组对应位置的值,从而更改数组。...下面的两个声明都是使p2指向a2的第一个整型元素: int *p2=&a2[0][0]; int *p2=a2[0]; 作为函数参数的多维数组 作为函数参数的多为数组名的传递方式和一维数组相同...再来看下面一个例子: char arr[]="hello"; char *arr2="hello";   前一个声明表示字符数组,后一个声明表示字符串常量,它们的区别如下: ?

    1.3K30

    c语言如何利用指针间接赋值

    你能够用它完成一些奇淫技巧,也会遇到一些不可捉摸的错误。 其中,指针有一个非常重要的作用:间接赋值。...你能够通过n级指针去修改n-1级指针的内容,甚至直接修改指针所指向的内存空间 例如: 你在main函数里面声明了一个字符串指针,然后你想通过调用一个外部函数来修改它。...这个时候,你就可以将这个字符串指针的地址传递给函数。这样,函数的参数就是一个二级指针了,通过这个二级指针,你可以很方便的修改字符串的内容。...; printf("T2 %d\n",p2); //打印出地址 ,会发现和实参的地址一样 } //间接赋值 //利用n级指针 改变n-1级指针的值 int main(int argc,char...s=45051 如何编写生活中的C语言 http://www.makeru.com.cn/live/5413_2649.html?s=45051

    2K10

    【C 语言】字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 形参指针间接赋值 | 返回值状态 | 形参指针处理 | 形参指针判空 | 形参返回值 )

    两个指针变量 , 一个指向首部 , 一个指向尾部 , 进行 翻转 , 逆序 等操作 ; 字符串翻转模型 : 借助 指针 进行翻转 , 或 借助 栈 后进先出的特性 , 进行 翻转 ; 一、业务子函数接口定义要点...---- 在上一篇博客 【C 语言】字符串模型 ( strstr-while 模型 ) 的基础上 , 将相关功能封装成 API 函数 , 将 主函数 与 子业务 函数分离开 ; 自定义函数接口 ; 分离...自定义的 业务子函数 与 主函数 main() ; 定义的接口如下 : 要点 1 形参指针间接赋值 : 主要是获取子串大小 , 通过 int *sub_count 参数的 间接赋值 , 实现函数结果返回...; 要点 2 返回值状态 : 返回值主要是 反应函数执行状态 , 返回 0 代表函数执行成功 ; /* * 获取字符串中子串个数接口 * char *main_str : 大字符串 *..., 再将返回值 通过 间接赋值 赋值给 形参中的 返回值指针 指向的 内存地址 ; /* * 获取字符串中子串个数接口 * char *main_str : 大字符串 * char *sub_str

    3.2K10

    【C++】C++ 引用详解 ⑦ ( 指针的引用 )

    一、二级指针可实现的效果 指针的引用 效果 等同于 二级指针 , 因此这里先介绍 二级指针 ; 使用 二级指针 作为参数 , 可以实现如下功能 : 动态内存管理 : 借助二级指针 , 可以在函数中分配或释放内存...; 如 : 创建一个动态数组或调整现有数组的大小 , 在函数中需要一个指向指针的指针作为参数 , 以便修改原始指针 ; void createArray(int **arr, int size) {...二级指针 , 其 实现的效果 , 等同于 二级指针 ; C++ 编译器 遇到 指针的引用 时 , 会自动将 引用指针 转为 二级指针 ; 2、引用本质 - 函数间接赋值简化版本 使用函数进行间接赋值..., 需要满足如下三个条件 : 函数中定义 指针类型 的 形参 , 调用函数时 修改函数外的 实参 ; 将 实参 取地址 , 传递给 函数 ; 在函数中 , 通过指针修改 实参的值 , 以达到修改外部变量的效果...; 如果将 函数 的形参类型 设置为 引用 类型 , 也能达到 间接赋值 的效果 ; 引用 实际上是 把 间接赋值 的三个条件的后两个条件进行了合并 , C++ 编译器遇到引用 , 还是需要将 引用

    38220

    C语言之指针变量

    既不能间接修改变量的值,也不可重新赋值新变量地址) 总结:1、const关键字写在数据类型的前面和后面是等效关系;   2、指向常量的指针:不能间接修改所指向变量的值,但是可以给指针重新赋值新地址   ...3、常量指针:可以间接修改指向变量的值,但是不能重新赋值新变量地址   4、指向常量的常量指针:有2个const修改,既不能间接修改变量的值,也不可重新赋值新变量地址 验证示例代码: //1、指针变量,...但是可以间接修改当前指向的变量的值 //4、测试指向整型常量的常量指针:既不能间接修改变量的值,也不能重新赋值新的变量地址 int e = 41, e2 = 42;...*/ 四、指针和字符串的关系,变量内存栈区和常量区区别 测试字符数组,指向字符数组的指针,和指向字符串的指针的区别; 字符数组和指针存储的字符串在内存中的存储位置:即栈区存储和常量区存储的区别 //1...说明:字符数组存在内存中的栈区,常量字符串存在内存中的常量区 /* 如果通过数组来保存字符串,那么字符串变量可以修改,存在内存栈中,当作用域结束时自动释放该变量; 如果通过指针来保存字符串

    2.1K30

    【AI系统】QNNPack 算法

    间接缓冲区依赖于多个参数:输入、输出和滤波器张量的形状,卷积步幅、扩张和隐式填充,以及指向输入张量和显式零张量的指针,以及输入张量中像素行的步幅。...批量大小:批量大小的变化仅需要对先前未初始化的批次索引部分重新初始化间接缓冲区。 输入张量或显式零向量的指针:这些输入参数的变化需要完全重新初始化间接缓冲区。...每计算一个空间位置输出,使用一个间接缓冲区;空间位置相同而通道不同的输出使用相同间接缓冲区,缓冲区中的每个指针用于索引输入中 IC 个元素。...图中将平面缓冲区展示为三维的形式(引入 IC 维度),意在说明间接缓冲区的每个指针可索引 IC 个输入元素,而每个间接缓冲区索引的内容即为与权重对应的输入内存区域。....); } } } 由于间接缓冲区已经被组织成了特定的形状,因此每次更新 M 个指针时,只需要从间接缓冲区指针(伪代码中 p_indirect_buffer)中获取。

    5710

    C 语言小知识

    如果没有这么做的话, 将会导致你的程序出现内存泄漏。 栈是一个特殊的内存区域, 存储函数创建的本地变量。 它的工作原理是每个函数的参数被压入堆栈,并在函数内使用。...如果变量不是用 malloc 直接获取, 也不是在函数内通过 malloc 间接获取, 那么这个变量就是在栈上。...堆栈需要注意的三个问题 如果你在栈上用 malloc 获取了一块内存, 并将指针指向这块内存, 当函数退出时, 指针将会被推出栈道并丢失; 如果在栈上使用过量的数据(大型数据结构和数组), 将会出现栈溢出...在这种情况下, 应通过 malloc 使用堆内存; 如果在栈上将指针指向变量, 将它作为你函数的返回值, 那么接受返回值的函数将会出现段错误(Segmentation fault),因为指针指向的数据已经被出栈并被清理了...指针 指针的典型用法 向系统申请一块内存, 包括字符串以及结构体; 作为参数向函数传递大块内存,通过使用指针就不用传递整个内存块; 指针指向函数的地址作为进行动态回调; 负责扫描内存或文件,比如:将网络

    97920

    【C++】C++ 引用详解 ② ( 引用的意义 | 引用本质分析 | 引用的常量特征 | 引用所占内存空间与指针相同 | 引用在 C++ 编译器实现 | 引用编译时会自动翻译为常量指针 )

    一、引用的意义 1、意义说明 " 引用 " 的 意义 : 引用 作为 已存在 变量 的 别名 , 其 效果 等同于 一级指针 ; 引用 使用 简单 , 不需要像指针一样 , 使用取地址符 获取地址 ,...使用 指针符号 * 访问数据 ; 2、引用与指针对比 引用 与 指针示例 : 下面的两个函数 , 分别使用 指针 和 引用 作为参数 , 二者实现了相同的功能 , 性能也相同 ; 但是使用引用 , 可以像操作变量一样操作外部元素...在向 void swap(int* a, int* b) 函数 , 传入参数时 , 如果是 指针做参数 , 传入的参数必须是地址 , 需要开发者手动使用 取地址符 & 获取变量地址 , 传递给 函数..., 需要满足如下三个条件 : 函数中定义 指针类型 的 形参 , 调用函数时 修改函数外的 实参 ; 将 实参 取地址 , 传递给 函数 ; 在函数中 , 通过指针修改 实参的值 , 以达到修改外部变量的效果...; 如果将 函数 的形参类型 设置为 引用 类型 , 也能达到 间接赋值 的效果 ; 引用 实际上是 把 间接赋值 的三个条件的后两个条件进行了合并 , C++ 编译器遇到引用 , 还是需要将 引用

    38120

    Ext2文件系统布局,文件数据块寻址,VFS虚拟文件系统

    ,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。...如果剩下的三个索引项 Blocks[12]到 Blocks[14]也是这么用的,就只能表示最大 15KB的文件了,这是远远不够的,事实上,剩下的三个索引项都是间接索引。...如果打开一个字符设备文件,那么它的 read、 write操作肯定和常规文件不一样,不是读写磁盘的数据块而是读写硬件设备,所以 file结构体应该指向不同的 file_operations结构体,其中的各种文件操作函数由该设备的驱动程序实现...我们传给 open、 stat等函数的参数的是一个路径,例如 /home/akaedu/a,需要根据路径找到文件的 inode。...每个 inode结构体都有一个指向 inode_operations结构体的指针,后者也是一组函数指针指向一些完成文件目录操作的内核函数。

    1.8K01

    Ext2文件系统布局,文件数据块寻址,VFS虚拟文件系统

    ,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。...如果剩下的三个索引项 Blocks[12]到 Blocks[14]也是这么用的,就只能表示最大 15KB的文件了,这是远远不够的,事实上,剩下的三个索引项都是间接索引。...如果打开一个字符设备文件,那么它的 read、 write操作肯定和常规文件不一样,不是读写磁盘的数据块而是读写硬件设备,所以 file结构体应该指向不同的 file_operations结构体,其中的各种文件操作函数由该设备的驱动程序实现...我们传给 open、 stat等函数的参数的是一个路径,例如 /home/akaedu/a,需要根据路径找到文件的 inode。...每个 inode结构体都有一个指向 inode_operations结构体的指针,后者也是一组函数指针指向一些完成文件目录操作的内核函数。

    77420

    【C 语言】字符串模型 ( 两头堵模型 | 将 两头堵模型 抽象成业务模块函数 | 形参返回值 | 函数返回值 | 形参指针判空 | 形参返回值操作 )

    一般使用 函数形参 间接赋值 进行返回 ; 下面的代码中 int *count 是返回值 ; int get_count(char *str_all, int *count) 函数返回值 : 函数的返回值..., 最终执行完毕后 , 再写出到指针指向的内存中 ; // 保存非空字符串长度 , 局部临时变 , 计算结果 int count_tmp = 0; // 计算结果 count_tmp...接收 函数形参 char *str = str_all; // 两个字符串索引 , i 是指向头部 , j 指向尾部 int i = 0, j = strlen(str) -...1; // 保存非空字符串长度 , 局部临时变 , 计算结果 int count_tmp = 0; // 循环条件是 i 指针指向的 位置 为空 则继续循环 //..."; // 要统计的结果 int count = 0; // 调用函数计算上述字符串 收尾不为空 的子串 int ret = get_count(str, &

    73220

    深入理解C语言指针

    大家好,又见面了,我是你们的朋友全栈君。 一、指针的概念 要知道指针的概念,要先了解变量在内存中如何存储的。在存储时,内存被分为一块一块的。每一块都有一个特有的编号。...指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。...p = &nums[0]赋值 int *p = nums, i; //i 作为循环变量 //p 指向数组第一个元素(数组首地址),我们可以直接用间接寻址符,获取第一个元素的内容 printf("nums...四、指针与函数 前面学习函数学到,函数参数可以为 int、char、float 等,但是在操作时,这些参数只作为形参,所有操作都只在函数体内有效(除对指针的操作外),那么今天来学习一下指针作为函数参数。...4.3、指向函数的指针 C 语言中,函数不能嵌套定义,也不能将函数作为参数传递。但是函数有个特性,即函数名为该函数的入口地址。我们可以定义一个指针指向该地址,将指针作为参数传递。

    48420

    深入理解C语言指针

    指针运算符*(间接寻址符):与&为逆运算,作用是通过操作对象的地址,获取存储的内容。例:x = &i,x 为 i 的地址,*x 则为通过 i 的地址,获取 i 的内容。...也可以用&p = nums[0]赋值 int *p = nums, i; //i 作为循环变量 //p 指向数组第一个元素(数组首地址),我们可以直接用间接寻址符,获取第一个元素的内容...; //此时可以做字符串的操作 //输出 printf("%s", sentence); //通过下标取字符 printf("%c", sentence[0]); //获取字符串长度,其中 strlen...四、指针与函数 前面学习函数学到,函数参数可以为 int、char、float 等,但是在操作时,这些参数只作为形参,所有操作都只在函数体内有效(除对指针的操作外),那么今天来学习一下指针作为函数参数...4.3、指向函数的指针 C 语言中,函数不能嵌套定义,也不能将函数作为参数传递。但是函数有个特性,即函数名为该函数的入口地址。我们可以定义一个指针指向该地址,将指针作为参数传递。

    1K00
    领券