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

C语言-指针作为函数类型

前言 C语言函数里最常用就是指针传和返回地址,特别是字符串处理中,经常需要封装各种功能函数完成数据处理,并且C语言标准库里也提供了string.h 头文件,里面包含了很多字符串处理函数;这些函数的参数和返回值几乎都是指针类型...func(&a,&b); //func(100,200) printf("a=%d,b=%d\n",a,b); return 0; } void func(int *a,int *b) { int c;...c=*a; *a=*b; *b=c; } //return语句只能返回一个值 //如果函数想返回多个值,可以使用指针()实现。...注意: 从大到小或者小到大排序可以通过函数区分。...='\0'){} return str-p-1; } /* 函数功能: 实现字符串排序.支持从小到大或者大到小 函数: char *p 将要排序的字符串 char flag 选择排序方式

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

C 语言】数组 ( 一维数组退化 | 二维数组退化 | 函数等价关系 )

文章目录 一、一维数组退化 二、二维数组退化 三、数组等价关系 一、一维数组退化 ---- C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ; 将 int..., 函数中处理 array 数组时 , 不知道该数组的元素个数 , 编译器只能确认 , 该参数是一个 int * 指针类型 ; 这样操作是为了提高 编译器 的效率 , 提高程序执行的效率 , 函数的 ...array[] void fun(int array[]) { } int *array void fun(int *array) { } 二、二维数组退化 ---- 二维数组 作为 函数 ,...也是 指针 , 则为 二级指针 ; 实参为 二维数组 int array[10][20] , 等效的 为 一级指针 int (*array)[20] ; 二维数组 的 数组的元素 是 一维数组...; 外围数组 ( 第二维 ) 退化为 指针 , 指针 指向的元素 是 一维数组 , 则为 指向 一维数组 的指针 , 每个一维数组有 20 个元素 ;

2.7K10

C 语言】字符串模型 ( 字符串翻转模型 | 抽象成业务函数 | 返回值 | 函数返回值 | 函数处理 | 指针判 )

文章目录 一、字符串翻转模型 业务函数 二、完整代码示例 一、字符串翻转模型 业务函数 ---- 将上一篇博客 【C 语言】字符串模型 ( 字符串翻转模型 ) 的代码 , 主要业务逻辑 , 抽象成函数...; 字符串翻转模型 业务函数 要点 : 返回值 : 函数的返回值 , 一般使用 函数 间接赋值 进行返回 ; 下面的代码中 char *str 是返回值 ; int inverse(char *...str) 函数返回值 : 函数的返回值 , 反映的是函数的执行结果状态 , 返回 0 执行成功 , 返回 -1 执行失败 ; 函数处理 : 在 函数中 , 如果涉及到修改 指针变量 , 一般不直接使用..., 创建一个临时局部变量 , 接收 , 然后再执行相关操作 ; // 创建临时变量接收 函数 , 不要直接改变形的函数指向 char *str_tmp = str; 指针判...: 函数的第一项任务就是 判定 指针是否合法 , 如果任何一个指针为 , 直接返回 -1 ; // 判断传入的字符串指针是否为 if(str_tmp == NULL)

89410

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

, 进行 翻转 , 逆序 等操作 ; 字符串翻转模型 : 借助 指针 进行翻转 , 或 借助 栈 后进先出的特性 , 进行 翻转 ; 一、业务子函数接口定义要点 ---- 在上一篇博客 【C...语言】字符串模型 ( strstr-while 模型 ) 的基础上 , 将相关功能封装成 API 函数 , 将 主函数 与 子业务 函数分离开 ; 自定义函数接口 ; 分离 自定义的 业务子函数 与 主函数...main() ; 定义的接口如下 : 要点 1 指针间接赋值 : 主要是获取子串大小 , 通过 int *sub_count 参数的 间接赋值 , 实现函数结果返回 ; 要点 2 返回值状态...: 定义 局部 临时 指针变量 , 接收 函数参变量 , 尽量不修改 函数 的值 ; 指针判 : 凡是传入的指针 , 一律判定指针是否合法 ; 返回值处理 : 返回值不要直接修改 ,..., 失败返回失败代码 */ int get_sub_count(char *main_str, char *sub_str, int *sub_count) { // 为了不修改 函数

3.1K10

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

文章目录 一、将 两头堵模型 抽象成业务模块函数 二、完整代码示例 一、将 两头堵模型 抽象成业务模块函数 ---- 将 两头堵模型 抽象成业务模块函数 相关要点 : 返回值 : 函数的返回值 ,...一般使用 函数 间接赋值 进行返回 ; 下面的代码中 int *count 是返回值 ; int get_count(char *str_all, int *count) 函数返回值 : 函数的返回值..., 反映的是函数的执行结果状态 , 返回 0 执行成功 , 返回 -1 执行失败 ; 指针判 : 函数的第一项任务就是 判定 指针是否合法 , 如果任何一个指针为 , 直接返回 -1 ;...== NULL || count == NULL"); return -1; } 返回值操作 : 函数的真正返回值 , 不要急着写入到指针指向的内存中 , 先放在局部变量中...printf("error : str_all == NULL || count == NULL"); return -1; } // 局部临时指针变量 接收 函数

68120

【JavaScript】函数 ③ ( 与 实参 匹配问题 | 实参个数 = 个数 | 实参个数 > 个数 | 实参个数 < 个数 )

一、JavaScript 函数 与 实参 匹配问题 1、函数参与实参不匹配问题 在 其它语言 中 , 如 Java 语言 , 要求 函数的 形式参数 和 实际 参数 必须一一对应匹配 , 否则就会报错...; 在 JavaScript 中 , 对 和 实参 的 匹配要求比较宽松 , 即使二者 个数 不匹配 , 也不会报错 ; 2、参与实参个数匹配 如果 实参 的个数 , 与 个数一致 , 则正常输出结果...传入 2 个实参, 输出正常结果 add(1, 2); 输出结果为 3 ; 3、实参个数 > 个数 如果传入的 实参个数 大于 个数 , 则取 个数个 实参 ; 下面的代码中..., 有 2 个 , 传入 3 个实参 , 此时函数只接受 前 2 个实参 , 第 3 个实参不接收 , 也就不参与函数运算 ; // 定义函数 有 2 个 function...如果 传入的 实参个数 小于 个数 , 那么 后面 没有实参对应的 , 就被当做 声明后未赋值的变量 , 默认值就是 undefined ; 下面的 add 函数中 , 定义了 2 个

5710

请教关于C语言和实参存储单元的问题?

首先我们限定一下问题,只限于cdecl的调用约定,函数没有被编译器做inline的优化(C++才有inline,但是C编译器也可能自己把函数调用优化掉)。...除了cdecl以外,C中其他常用的调用约定包括stdcall和fastcall,C++中还有一个thiscall(用于调用类的成员函数)。fastcall会使用寄存器来传递一部分参数。...而且C语言也不支持传递引用作为参数。 纠结的在于传递数组作为参数这种情况,对编译器来说,实际上的参数是个指针,但是从代码形式上来看好像是个数组……这个我也不知道该怎么算,这简直是个哲学问题。...这个时候显然不是“实参和各占用独立的存储单元”。...使用寄存器传参数的时候,按照传统的占用存储的说法就不合适了,不过由于这些寄存器都是易失的,用于传之后寄存器里原来的值必须先保存到堆栈上,也可以相当于占用了相应的存储空间,前面的讨论仍然是适用的。

1.2K30

C语言函数参数详解】——实际参数(实参)&形式参数(

: 我们如果在函数外部使用函数,这是不可行的。...2.在函数调用过程中才实例化(分配内存单元) 函数调用之前,还未创建 函数调用过程中,才被实例化 函数调用结束,生命周期结束,被销毁 三.参与实参的关系 了解了什么是函数的和实参,...他们的关系是: 实例化之后其实相当于实参的一份临时拷贝。 这里我们对函数的实参和进行分析: 我们来尝试写一个函数交换两个整形变量的内容。...这是因为在函数调用时,x,y是实参num1,num2的一份临时拷贝,和实参并没有建立真正意义上的联系,x,y是两个独立的变量,和实参num1,num2分别占用不同的内存空间,在这里,和实参只是数值相同罢了...: 实例化之后其实相当于实参的一份临时拷贝。

73610

-实参概念剖析

:即函数的自变量,其初值来源于函数的调用。只有在程序执行过程中调用了函数,才有可能得到具体的值,并参与运算求得函数值。...和实参的区别: 1、英文名字不同:是parameter,实参是argument。 2、本质不同:的本质是一个名字,不占用内存空间。实参的本质是一个变量,已经占用内存空间。...站在函数里面,你能看到的函数参数就是--。 //内部有效 2 .站在函数外面,你调用函数输入的参数就是--实参。...所谓的实参害人不浅,概念的抽象应该是简化和解释逻辑,结果这个两个名称最让初学者理解不了。应该是最初翻译带来的弊端。 举例: 1....比如你定义一个函数void add(int a, int b),这里的a和b就是。 2. 当你进行函数调用的时候,add(1, 2),这里的1和2就是实参。

1.3K20

C语言:数组作为函数参数(数组元素做实参,数组名称做

数组元素的值做实参 数组元素作为实参时,将数组元素的值传递给,传递的方向是从实参向的单向值传递。 例:编写函数求一维数组的最大值。...a:b; } 数组名称做 当数组作为时,虽然形式上还是数组,比如void sort(int arr[ ]),但是并不意味着真正建立了一个包含和实参数组大小相同的数组,在调用函数时也不对它分配存储单元...return 0; } void fun(int a[]){ for(int i=0;i<=9;i++) a[i]=a[i]+10; } 注意: 用数组元素做实参时,向参变量传递的是数组元素的值...用数组名做函数实参时,向传递的是数组首元素的地址。...数组名作为函数实参传递时,函数定义处作为接收参数的数组类型既可以指定长度也可以不指定长度。 数组元素作为函数实参传递时,数组元素类型必须与参数据类型一致 。

2.4K20

C语言笔记】变函数

提到变函数,我们的感觉是不是既熟悉又陌生?感觉熟悉是因为我们平时都在使用着,如我们常使用的printf()函数与scanf()函数就是典型的变函数。...因为printf()函数是变函数我们才可以根据我们的需要灵活地输出变量的值。...//给printf函数传入n个参数 我们可以根据需要给printf()函数传入n个参数,这就是变函数。 感觉陌生是因为我们没有试着创建变函数。...要创建变函数需要包含头文件stdarg.h,并且创建变函数应按照如下步骤进行: 【第一步】定义一个使用省略号的函数原型,如printf()与scanf()函数的原型为 int printf (const...2.0, 3.0, 4.0, 5.0, 6.0); printf("sum1 = %f\n", sum1); printf("sum2 = %f\n", sum2); return 0; } 变函数

1.1K40

c++:*与&, *&p, 指针传递,引用传递,数组

表示&p指向地址内存空间的值,在这里表示a的地址 *&p = (&p) = p p是指针,&p为p的地址 (取包有内容p的盒子的编号) 再进行解引用(拆开盒子),所以得到 *&p = p 指针传递 出现在函数定义中...”; } void main() { int b = 10; test(&b); cout << “b的值:” << b << “\n” << “b的地址:” << &b << “\n”; } ...10; test(b); cout << “b的值:” << b << “\n” << “b的地址:” << &b << “\n”; } 相当于变量的别名,函数内后续的任何改变都会影响原变量 数组...当要使用数组作为函数时,因为一个数组不能使用另外一个数组初始化,也不能将一个数组赋值给另外一个数组,而在“1.1 非引用”中提到要用实参的副本来初始化形,所以实参为数组时,不能直接传递给...则可以用如下三种方式定义该函数: int FindMax(int* array); int FindMax(int array[]); int FindMax(int array[10]); 虽然不能直接传递数组,但是函数的可以写成数组的形式

24520

C 语言C 项目开发代码规范 ( 参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收 | 函数返回值 | 作返回值 | 返回值处理 )

文章目录 一、C 项目开发代码规范 一、C 项目开发代码规范 ---- 上一篇博客 【C 语言】字符串模型 ( 键值对模型 ) 中 , 完成了字符串的 键值对 查找功能 , 代码不太规范 ; C 项目开发代码规范...: 参合法性判断 : 函数入口处 , 判断函数是否为 , 如果为 , 直接返回 ; int get_value(char *key_value, char *key, char *value...语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序字符串操作 | strncat 函数 ) 博客 , 该博客中就使用了全局变量存放函数结果 , 不支持多线程访问 ; 函数中使用局部变量接收...: 函数中的指针变量 , 不要直接使用 , 如果涉及到修改指针指向的操作 , 建议 创建 函数 中 局部指针变量 接收该 指针变量 ; int get_sub_count(char *main_str..., 都是通过 函数指针 , 对 指针 进行 间接赋值 完成 ; 返回值处理 : 返回值不要直接修改 , 先定义临时局部变量保存返回值 , 最后执行完毕 , 再将返回值 通过 间接赋值 赋值给

1.4K20

C++打怪升级(一)- 命名空间、缺省、重载

---- 缺省参数是啥 缺省参数即函数默认参数,在定义或声明函数时,其可以直接给出参合适的缺省(默认)值;在调用含有缺省参数的函数时,调用者就可以选择对缺省参数是否进行实参的传入了,如果没有指定实参则采用该的缺省值...d\n", val); } int main() { function(); function(10); return 0; } 缺省参数的运用 函数定义或声明时部分缺省参数的设置规则: 从右向左可以连续缺省...正确举例: 错误举例: 全缺省参数 即定义或声明的函数都是有缺省值(初始值、默认值)的。...100); Func(100, 200); Func(100, 200, 300); return 0; } ---- 部分缺省参数 即函数定义或声明中部分有缺省值(初始值、默认值)...函数重载是什么 函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型

77420
领券