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

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

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

1.4K30

C语言和实参的区别?

实参程序中已经分配了内存空间的参数,它可以被赋予一个具体的值,比如常数、数组、地址(指针),也可以是一个变量名、数组名或表达式,当然也包括指针变量。...则是你在写一个被调函数时,为了说明用到的自变量的类型、要进行什么操作而定义的,在调用函数前它不会被分配内存空间,更不会被赋予具体的值。...调用函数时,参会被分配一个新的内存空间,实参的值就会被“复制”进去,让它在被调函数中参与运算。而实参本身不参与这个运算,它仅仅起到一个传递值的作用(不过在C++中可以用&改变实参的值)。...如果参数的形式指针,那么“复制”的就是地址。

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

C语言和实参的区别?

实参程序中已经分配了内存空间的参数,它可以被赋予一个具体的值,比如常数、数组、地址(指针),也可以是一个变量名、数组名或表达式,当然也包括指针变量。...则是你在写一个被调函数时,为了说明用到的自变量的类型、要进行什么操作而定义的,在调用函数前它不会被分配内存空间,更不会被赋予具体的值。...调用函数时,参会被分配一个新的内存空间,实参的值就会被“复制”进去,让它在被调函数中参与运算。而实参本身不参与这个运算,它仅仅起到一个传递值的作用(不过在C++中可以用&改变实参的值)。...如果参数的形式指针,那么“复制”的就是地址。

3.6K20

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

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

2.7K10

c语言函数指针的用法_函数指针作为

文章目录 导引 指针函数 指针函数定义 指针函数的三种写法 代码示例 函数指针 定义 代码示例 函数指针和指针函数区别 定义不同 写法不同 用法不同 导引 函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼...,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,特别是刚开始学习这门语言的童鞋,估计碰到这些东西就已经要崩溃了,...先看看下面这个函数声明: int fun(int x,int y); 这种函数应该都很熟悉,其实就是一个函数,然后返回值一个 int 类型一个数值。...其返回值一个 int 类型的指针,一个地址。 这样描述应该很容易理解了,所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。...写法不同 指针函数:int* fun(int x,int y); 函数指针:int (*fun)(int x,int y); 可以简单粗暴的理解为,指针函数的*属于数据类型的,而函数指针的星号属于函数名的

57120

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

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

1.2K30

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

无论实参何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给。...,它们都必须有确定的值 二.什么形式参数() 那什么形式参数呢?...2.在函数调用过程中才实例化(分配内存单元) 函数调用之前,还未创建 函数调用过程中,才被实例化 函数调用结束,生命周期结束,被销毁 三.参与实参的关系 了解了什么函数的和实参,...他们的关系实例化之后其实相当于实参的一份临时拷贝。 这里我们对函数的实参和进行分析: 我们来尝试写一个函数交换两个整形变量的内容。...这是因为在函数调用时,x,y实参num1,num2的一份临时拷贝,和实参并没有建立真正意义上的联系,x,y两个独立的变量,和实参num1,num2分别占用不同的内存空间,在这里,和实参只是数值相同罢了

64810

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语言:数组作为函数参数(数组元素做实参,数组名称做

数组元素的值做实参 数组元素作为实参时,将数组元素的值传递给,传递的方向从实参向的单向值传递。 例:编写函数求一维数组的最大值。...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个参数,这就是变函数。 感觉陌生是因为我们没有试着创建变函数。...这里第二个参数double类型,传入的不定参数就应是double类型 */ sum += va_arg(ap, double); } /*【第五步】:使用va_end完成清理工作...sum()用于求lim个数之和,并且这lim个数的类型必须double类型,因为sum函数实体中使用va_arg访问参数列表中的参数类型为double类型

1.1K40

SpringMVC通过实体类型获取请求参数(一)

在SpringMVC中,获取请求参数的方式有很多种,除了之前介绍的@RequestParam、@PathVariable、@RequestHeader和@CookieValue注解,还可以使用实体类型获取请求参数...实体类型的定义实体类型指在Controller方法中定义一个实体类的对象作为参数,通过该对象来接收请求参数。...实体类型的用法使用实体类型可以将请求参数封装到一个实体对象中,从而简化代码,并且可以避免在方法中使用@RequestParam注解声明大量的参数。...实体类型的注意事项在使用实体类型时,需要注意以下几点:实体类的属性名称必须与请求参数的名称一致。...实体类的属性类型必须与请求参数的类型一致,或者可以自动转换。例如,在上面的例子中,请求参数的类型为String,因此实体类的属性类型也必须为String,否则会抛出类型转换异常。

54620

【Python】类型注解 ④ ( 函数类型注解 | 函数类型注解语法 | 函数返回值类型注解 )

, 如果没有指定函数参数类型 , 那么定义函数时 , 调用 的成员 , 无法进行代码提示的 , 我们想要为 fun 函数定义一个 list 列表容器类型 data , 但是没有显示的指定该..., 调用函数时 , PyCharm 无法提示函数类型 : 在 调用 fun 函数时 , 代码提示只能提示参数的名称是 data , 具体参数是什么类型 , 不知道的 , PyCharm 也无法提示参数的类型...; 2、函数类型注解语法 函数类型注解语法 : def 函数名称(名称1: 类型1, 名称2: 类型2, ... , 名称n: 类型n) pass 函数类型注解..., 建议性的 , 不是强制性的 , 不按照注解的类型 , 也不会报错 ; 代码示例 : """ 类型注解 代码示例 """ def fun(data: list): data.clear...; 返回值 的 类型注解 , 建议性的 , 不是强制性的 , 不按照注解的类型返回 , 也不会报错 ; 示例 : # 函数 设置 类型注解 def add(x: int, y: int) ->

19910
领券