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

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

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

1.1K10

【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); // 可以直接将 函数名 (

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

熬夜整理万字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.2K20

面试爱问之const关键字

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

18620

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抄一万遍),因此编译期即可决议虚函数地址。

63610

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

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

1.3K30

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

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

3.1K10

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++】C++ 引用详解 ⑦ ( 指针引用 )

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

29020

C语言之指针变量

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

2K30

C 语言小知识

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

96120

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

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

26420

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

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

1.7K01

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

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

76220

C语言关键字详解(四)带你全面了解 const 关键字

下面用一个例子来说明: 这里有三个问题 第一个问题:如何理解被 const 修饰变量不能直接被修改中“直接”二字?...从上面我们可以观察到,被 const 修饰变量直接被修改时编译器会报错,但是我们仍然可以通过指针方式来间接改变值,也就是说,const 修饰变量使变量值不能被修改这一属性并不是绝对,它只是编译器层次上保证...下面举例说明 在这里,我们定义了一个常量字符串,并尝试将其中第一个字符 h 改成大写 H ,我们可以看到,在编译期间程序没有任何报错,但是运行完我们发现程序崩溃了,接着我们进入调试,执行...这里和上面修饰参数道理其实是一样就不再赘述了,但是需要注意一点是,这里用static来修饰局部变量a,原因是a是一个局部变量,进入test函数该变量被创建,出test函数该变量被销毁,但是我们这里把...如何理解“直接”:const 修饰变量使变量值不能被修改这一属性并不是绝对,它只是编译器层次上保证,我们可以仍然通过间接,比如指针方式对其进行修改。

48300

【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, &

69220

【C 语言】二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数形参 使用示例 )

文章目录 一、二级指针 二、完整代码示例 一、二级指针 ---- 指针 作为 函数输入 : 调用者 负责 分配内存 ; 指针 作为 函数输出 : 函数 负责 分配内存 , 一般 传入二级指针 , 函数负责生成内存...返回一个 一级指针 变量 ; 令 二级指针 形参 指向 该 一级指针变量 , 即可通过间接赋值 返回相关结果 ; 代码示例如下 : /* * 生成 2 个字符串, 然后返回 */ int get_str...间接赋值 给 一级指针 *str2 = s2; return 0; } 二级指针 最终 指向内存释放 : 释放二级指针 指向 一级指针 指向内存地址 , 释放后 将指针指向地址置空...间接赋值 给 一级指针 *str2 = s2; return 0; } /* * 释放字符串内存 */ int free_str(char **str) { // 判断传入二级指针是否合法...len1, &str2, &len2); // 打印函数中生成字符串 printf("str1 = %s, str2 = %s\n", str1, str2); // 释放字符串指针指向内存

69610

深入理解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 语言中,函数不能嵌套定义,也不能将函数作为参数传递。但是函数有个特性,即函数名为该函数入口地址。我们可以定义一个指针指向该地址,将指针作为参数传递。

46820

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券