精华内容
下载资源
问答
  • c语言指针作为函数的参数

    万次阅读 多人点赞 2018-07-09 22:00:43
    指针变量作为参数也不例外,但是可以改变实参指针变量所指向变量值。 #include <stdio.h> void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py); int main(vo...
    
     

    在c语言中实参和形参之间的数据传输是单向的“值传递”方式,也就是实参可以影响形参,而形参不能影响实参。指针变量作为参数也不例外,但是可以改变实参指针变量所指向的变量的值。

    #include <stdio.h>
    void swap1(int x,int y),swap2(int *px,int *py),swap3(int *px,int *py);
    int main(void)
    {
    	int a=1,b=2;
    	int *pa=&a,*pb=&b;
    	swap1(a,b);
    	printf("s1:a=%d,b=%d\n",a,b);
    
    	a=1,b=2;
    	swap2(pa,pb);
    	printf("s2:a=%d,b=%d\n",a,b);
    
    	a=1,b=2;
    	swap3(pa,pb);
    	printf("s3:a=%d,b=%d\n",a,b);
    	
    	return 0;
    }
    void swap1(int x,int y){
    	int t;
    	t=x;
    	x=y;
    	y=t;
    }
    
    void swap2(int *px,int *py){
    	int t;
    	t=*px;
    	*px=*py;
    	*py=t;
    }
    
    void swap3(int *px,int *py){
    	int *pt;
    	pt=px;
    	px=py;
    	py=pt;
    }

    结果:

    第一个swap1函数运行结果是:x=2   y=1.但是第一个函数的形参是(int x,int y),实参是(int a,int b)。因为实参可以影响形参,而形参不可以影响实参。所以a,b的值是不变的。如图:

                 

    第二个swap2函数由图可知,pa和px都是a的地址,pb和py都是b的地址。此函数改变*px,*py的值。因为*px和a在同一储存单元,*py和b在同一储存单元。以改变实参指针变量所指向的变量的值。所以如图*pa和*pb的值也改变了,最后输出结果也就改变了。

    第三个swap3同样的道理,如上图直接改变了形参指针px和py的值,改变的只是地址,地址所对应的值没有改变,又因为形参是不会影响实参,所以pa和pb没有改变。所以a,b值没有改变。

    展开全文
  • 另一种是函数指针作为函数的参数。这一篇分享的是函数指针作为函数的参数。函数指针作为函数的参数函数指针可以作为一个参数传递给另一个函数。这时函数指针的使用就像普通的常量和变量一样。当函数指针作为参数传递...

    函数指针有两种常用的用法,一种是作为结构体成员,关于函数指针作为结构体成员的用法可移步至上一篇函数指针作为结构体成员进行查看。另一种是函数指针作为函数的参数。这一篇分享的是函数指针作为函数的参数

    函数指针作为函数的参数

    函数指针可以作为一个参数传递给另一个函数。这时函数指针的使用就像普通的常量和变量一样。当函数指针作为参数传递的时候,这时接收参数传递的函数通常需要根据这个指针调用这个函数。作为参数传递的函数指针通常表示回调函数(Callback Functions)

    1什么是回调函数?

    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

    1回调函数在实际中有什么作用?

    先假设有这样一种情况:我们要编写一个库,它提供了某些排序算法的实现(如冒泡排序、快速排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。

    例如,在C语言的通用工具库stdlib.h中,有如下一个函数原型:

    void qsort(void *, size_t, size_t, int (comp*)(const void *, const void *))

    这是在C通用工具库中声明的一个快速排序算法函数,其可以用来排序int类型、float类型以及字符串数据,可以按从小到大的顺序也可以按从大到小的顺序排序。其关键在于函数指针comp指向的函数的具体实现。

    举例说明

    上一节我们使用函数指针作为结构体成员来实现四则运算,这里一节我们稍微修改一下代码,使用函数指针作为函数参数来实现四则运算。

    设计如下函数:

    int calculate(int a, int b, fun_t operation){
     int result;
     result = operation(a, b); // 运算
     return result;
    }

    其中,fun_t是一个函数指针,其定义为:

    typedef int (*fun_t)(int, int);

    该函数指针fun_t指向一个带两个int类型的形参、int类型的返回值的函数。使用关键字typedef对int (*)(int, int)进行重命名(封装)为fun_t。关于typedef与define的区别可查看往期笔记:#define与typedef的区别?

    根据函数指针变量operation指向不同的运算函数可实现加法运算、减法运算、乘法运算、除法运算。

    主函数代码如下:

    int main(void){
     int result;
     int a = 192, b = 48;

     /* 两个数相加的操作 */
     result = calculate(a, b, add2);
     printf("加法运算: %d+%d = %d\n",a, b, result);
     
     /* 两个数相减的操作 */
     result = calculate(a, b, sub2);
     printf("减法运算: %d-%d = %d\n",a, b, result);
     
     /* 两个数相乘的操作 */
     result = calculate(a, b, mul2);
     printf("乘法运算: %d*%d = %d\n",a, b, result);
     
     /* 两个数相除的操作 */
     result = calculate(a, b, div2);
     printf("除法运算: %d/%d = %d\n",a, b, result);
     
     return 0;
    }

    实现运算的4个函数很简单,如下:

    int add2(int a, int b){
     return a+b;
    }

    int sub2(int a, int b){
     return a-b;
    }

    int mul2(int a, int b){
     return a*b;
    }

    int div2(int a, int b){
     return a/b;
    }

    程序运行结果为:

    f3a84557af30df57cdfde79f2a2c5720.png

    以上就是今天的分享,如有错误欢迎指出!关注小编,和小编一起打卡学习!

    052ffb25b545aaf80a56c26479d32cd5.gif

    d0947f1e4addabe176b390071c943f2b.png

    展开全文
  • C语言 | 函数指针作为函数的参数

    千次阅读 多人点赞 2019-08-05 08:22:38
    另一种是函数指针作为函数的参数。这一篇分享的是函数指针作为函数的参数。 一、函数指针作为函数的参数 函数指针可以作为一个参数传递给另一个函数。这时函数指针的使用就像普通的常量和变量一样。当函数指针作为...

    1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

    函数指针有两种常用的用法,一种是作为结构体成员,关于函数指针作为结构体成员的用法可移步至上一篇【C语言笔记】函数指针作为结构体成员进行查看。另一种是函数指针作为函数的参数。这一篇分享的是函数指针作为函数的参数。

    一、函数指针作为函数的参数

    函数指针可以作为一个参数传递给另一个函数。这时函数指针的使用就像普通的常量和变量一样。当函数指针作为参数传递的时候,这时接收参数传递的函数通常需要根据这个指针调用这个函数。作为参数传递的函数指针通常表示回调函数(Callback Functions)

    1、什么是回调函数?

    回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

    2、回调函数在实际中有什么作用?

    先假设有这样一种情况:我们要编写一个库,它提供了某些排序算法的实现(如冒泡排序、快速排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。

    例如,在C语言的通用工具库stdlib.h中,有如下一个函数原型:

    void qsort(void *, size_t, size_t, int (comp*)(const void *, const void *))
    

    这是在C通用工具库中声明的一个快速排序算法函数,其可以用来排序int类型、float类型以及字符串数据,可以按从小到大的顺序也可以按从大到小的顺序排序。其关键在于函数指针comp指向的函数的具体实现。

    二、举例说明

    上一节我们使用函数指针作为结构体成员来实现四则运算,这里一节我们稍微修改一下代码,使用函数指针作为函数参数来实现四则运算。

    设计如下函数:

    int calculate(int a, int b, fun_t operation)
    {
     int result;
     result = operation(a, b); // 运算
     return result;
    }
    

    其中,fun_t是一个函数指针,其定义为:

    typedef int (*fun_t)(int, int);
    

    该函数指针fun_t指向一个带两个int类型的形参、int类型的返回值的函数。使用关键字typedefint (*)(int, int)进行重命名(封装)为fun_t。关于typedef与define的区别可查看往期笔记:【C语言笔记】#define与typedef的区别?

    根据函数指针变量operation指向不同的运算函数可实现加法运算、减法运算、乘法运算、除法运算。

    主函数代码如下:

    int main(void)
    {
     int result;
     int a = 192, b = 48;
    
     /* 两个数相加的操作 */
     result = calculate(a, b, add2);
     printf("加法运算: %d+%d = %d\n",a, b, result);
     
     /* 两个数相减的操作 */
     result = calculate(a, b, sub2);
     printf("减法运算: %d-%d = %d\n",a, b, result);
     
     /* 两个数相乘的操作 */
     result = calculate(a, b, mul2);
     printf("乘法运算: %d*%d = %d\n",a, b, result);
     
     /* 两个数相除的操作 */
     result = calculate(a, b, div2);
     printf("除法运算: %d/%d = %d\n",a, b, result);
     
     return 0;
    }
    

    实现运算的4个函数很简单,如下:

    int add2(int a, int b)
    {
     return a+b;
    }
    
    int sub2(int a, int b)
    {
     return a-b;
    }
    
    int mul2(int a, int b)
    {
     return a*b;
    }
    
    int div2(int a, int b)
    {
     return a/b;
    }
    

    程序运行结果为:

    VHQH6x.md.png

    以上就是关于函数指针作为函数参数的笔记,如有错误欢迎指出!

    展开全文
  • 指针作为函数的参数,引用作为函数的参数  个人觉得引用作为函数的参数比指针作为函数的参数好用多了。 下面举个简单的例子: 引用作为函数的参数: #include #include using namespace std; class student { ...

        指针作为函数的参数,引用作为函数的参数

      个人觉得引用作为函数的参数比指针作为函数的参数好用多了。

    下面举个简单的例子:

    引用作为函数的参数:

    #include<iostream>
    #include<string>
    using namespace std;
    class student
    {
    	private:
    		char name;
    		char   sex;
    		int   num;
    	public:
    		student(char &name1,char &sex1,int &num1)
    		{
    			name=name1;
    			sex=sex1;
    			num=num1;
    		}
    		void print()
    		{
    			cout<<name<<endl;
    			cout<<sex<<endl;
    			cout<<num<<endl;
    		}
    	};
    	class student1:public student
    	{
    		private:
    			char major;
    		public:
    			student1(char &name1,char &sex1,int &num1,char &major1):student(name1,sex1,num1)	
    			{
    				major=major1; 
    			}
    			//void print()	
    		};
    	int	main()
    		{
    			char a,b,d;
    		 int  c;
    			cin>>a>>b>>c>>d;
    			student1 m(a,b,c,d);
    			m.print();
    			return 0;
    		}
    		
    	
    指针作为函数的参数
    	#include<iostream>

    #include<string>
    using namespace std;
    class student
    {
    	private:
    		char name;
    		char   sex;
    		int   num;
    	public:
    		student(char *name1,char *sex1,int *num1)
    		{
    			name=*name1;
    			sex=*sex1;
    			num=*num1;
    		}
    		void print()
    		{
    			cout<<name<<endl;
    			cout<<sex<<endl;
    			cout<<num<<endl;
    		}
    	};
    	class student1:public student
    	{
    		private:
    			char major;
    		public:
    			student1(char &name1,char *sex1,int *num1,char *major1):student(name1,sex1,num1)	
    			{
    				major=*major1; 
    			}
    			//void print()	
    		};
    	int	main()
    		{
    			char a,b,d;
    		 int  c;
    			cin>>a>>b>>c>>d;
    			student1 m(&a,&b,&c,&d);
    			m.print();
    			return 0;
    		}
    			 
    			
    			




    展开全文
  • 另一种是函数指针作为函数的参数。这一篇分享的是函数指针作为函数的参数。函数指针作为函数的参数函数指针可以作为一个参数传递给另一个函数。这时函数指针的使用就像普通的常量和变量一样。当函数指针作为参数传递...
  • 指针作为函数的参数

    2014-08-19 23:33:23
    这一句传一个地址给getptr里面p指针,这时候p指针获得是ptr指针的一个副本,确切说是ptr指向对象内存地址,所以这种方式在函数里面可以用来传一个指针指向数据,这个数据是引用,但是指针还是副本,就是p与ptr...
  • 指针作为函数的参数,可以使被调函数通过形参指针存取主调函数中实参指针指向的数据,实现数据的双向传递 需要传递一组数据,只传首地址运行效率比较高 实参是数组名时形参可以是指针 指针函数即返回值是使地址...
  • 指针作为函数的参数进行传递的时候,本质上还是进行的“值传递”,也就是复制了一个新的指向该地址的指针变量
  • 函数指针作为函数的参数 int min(int x, int y){ return (x ); } int(*pmin)(int, int)=min; int fun(int(*p)(int x, int y), int xx, int yy)//返回一个int类型值,有三个函数,第一个是有两个参数的函数指针 { ...
  • 指针作为函数的参数:当我们调用一个函数的时候,如果这个函数的参数是一个指针,那么我们就必须要为这个指针传递一个和指针类型相同的普通变量的地址,这个时候,在函数的内部去访问参数指针指向的变量的时候,其实...
  • C/C++基础 -- 指针与函数1、指针作为函数的参数1.1、指针作为函数的形参1.1、指针作为函数的形参1.2、通过指针形参返回多个运算结果 本博文由 西北工业大学MOOC 总结而来,以备以后回顾。 1、指针作为函数的...
  • (1)指针函数的参数-实现地址传递 (2)返回指针的函数 (3)利用指向函数的指针调用函数 指针函数的参数,具有以下用途: (1)指针作函数参数,这时形参接受的是实参的地址。函数中通过对指针的间接...
  • 都错误的认为 二维数组 和 二维指针作为函数的参数时是等价的。这种认知是错误的。究其原因,还是对数组和指针理解的不深入。今天把我的理解做一个总结: 假如一个函数的形参是一个二维指针,但是你实参传入的是一...
  • c语言指针的学习(指针作为函数的参数) 首先来了解一下实参与形参的区别: 形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。...
  • Qt C++ 函数指针作为函数的参数

    千次阅读 2019-03-07 10:42:23
    1:普通函数作为函数的参数 void ppp(int a,int b) { qDebug()&lt;&lt;a&lt;&lt;b; } void cmp(int a,int b,void(*hh)(int,int)) { hh(a,b); } void MainWindow4::on_pushButton_2_clicked() ...
  • 使用指针作为参数,可实现两种功能: 1、可以读取上一层函数中的变量的值 *p ; 2、可以修改上一层函数中变量的值 *p ;(普通的参数无法实现) #include <stdio.h> void test(int* p) { printf("before ...
  • 指针作为函数的参数进行传递的时候,本质上还是进行的“值传递”,也就是复制了一个新的指向该地址的指针变量。 只有在被调函数中,对指针进行引用操作,才可以达到不需要返回值,就对指针指向的变量做出相应的...
  • #include"iostream.h" #include"stdio.h" ...char *cp = "大家好,这里是指针作为函数参数的实例。"; showmessage(cp); //定义字符串数组 char str[]="大家好,这里是指针作为函数参数的实例。"; showme
  • 一,指针作为函数的输入和输出特性 输入特性的定义:由被调用函数的分配的内存 输出特性的定义:由调用函数分配内存 二,指针的输入特性的使用主函数分配内存 把内存的首地址转过去/******************************...
  • void test(int* p)//把一个内存地址传给一个函数 { //使用星号操作*p,来读写内存 printf("before test:%d \n",*p); *p=1; printf("now :%d\n",*p)...2.可以修改上一层函数中变量的值 *p(普通的参数无法实现)传递数
  • 今天编程时遇到了一个问题,就是想写一个函数,让这个函数通过参数返回内存某一个缓冲区首地址。在网上找了找,发现以下这段代码比较有代表性, 于是复制过来作为一个总结说明。 下面这段代码是正确,这段代码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,655
精华内容 3,462
关键字:

指针作为函数的参数