精华内容
下载资源
问答
  • 本文主要讲了c语言指针变量作为函数参数传递,下面一起来学习一下
  • 指针变量作为函数参数

    千次阅读 2018-10-18 23:18:52
    下面分析指针变量作为函数参数的优势。 例子:编写函数实现对两个变量的值进行传递。 函数1: void Swap1(int a,int b) { int tmp=a; a=b; b=tmp; } int main() { int a=10; int b=20; Swap(a,...

    函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型的数据。下面分析指针变量作为函数参数的优势。
    例子:编写函数实现对两个变量的值进行传递。
    函数1:

    void Swap1(int a,int b)
    {
    	int tmp=a;
    	a=b;
    	b=tmp;
    }
    
    int main()
    {
    	int a=10;
    	int b=20;
    	Swap(a,b);
    	printf("%d,%d\n",a,b);
    	return 0;
    }
    

    在这里插入图片描述
    说明:该函数采用值传递方式,如上图,在main函数中的实参变量a,b和Swap1中的形参变量a,b分别占用不同的存储单元,该Swap1中改变了形参变量的值但并不会影响实参变量的值,所以该函数不能实现对两个变量值的交换。
    函数2:

    void Swap2(int *p1,int *p2)
    {
    	int *tmp=p1; 
    	p1=p2;
    	p2=tmp;
    }
    
    int main()
    {
    	int a=10;
    	int b=20;
    	Swap2(&a,&b);
    	printf("%d,%d\n",a,b);
    	return 0;
    }
    

    在这里插入图片描述

    在这里插入图片描述
    说明:函数Swap2的两个形参p1、p2是指针变量,主函数调用时将a和b的地址分别赋给int *变量p1、p2,但在函数中p1、p2未被解引用,所以只是完成了p1、p2值的交换,并不能通过该函数实现对两个变量的交换。
    函数3:

    void Swap3(int *p1,int *p2)
    {
    	int *tmp;
    	*tmp=*p1;      //此语句有问题
    	*p1=*p2;
    	*p2=*tmp;
    }
    

    说明:*p就是a,是整形变量,而 * tmp是指针变量tmp所指向的变量。但我们并没有给tmp赋值,tmp中没有确定的值,因此tmp所指向的单元也是不可预见的。所以,对 * tmp赋值就是向一个未知的存储单元赋值,而这个未知的存储单元可能存储着一个有用的数据,这样就有可能破坏系统的正常工作状态。我们把这样没有访问权限的指针(地址)的指针称为野指针或悬挂指针。
    函数4:

    void Swap4(int *p1,int *p2)
    {
    	int tmp;
    	tmp=*p1;
    	*p1=*p2;
    	*p2=tmp;
    }
    

    在这里插入图片描述
    说明:该函数在Swap3的基础上,将 * p1的值赋给与 * p1相同的数据类型,即用整型变量tmp作为临时辅助变量实现了* p1和* p2的交换。
    在这里插入图片描述

    展开全文
  • C语言指针基础知识点(三)--指针变量作为函数参数

    千次阅读 多人点赞 2019-12-01 23:01:20
    指针变量作为函数参数    函数参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。 栗子: 对输入的两个整数按大小顺序输出。现用函数处理,而且...

    指针系列目录

      C语言指针基础知识点(一)–指针及指针变量
      C语言指针基础知识点(二)–指针变量的引用
      C语言指针基础知识点(三)–指针变量作为函数参数
      C语言指针基础知识点(四)–通过指针引用数组
      C语言指针基础知识点(五)–用数组名作函数参数
      C语言指针基础知识点(六)–通过指针引用多维数组
      C语言指针基础知识点(七)–通过指针引用字符串
      C语言指针基础知识点(八)–返回指针值的函数
      C语言指针基础知识点(九)–指针数组和多重指针
      C语言指针基础知识点(十)–动态内存分配与指向它的指针变量

    指针变量作为函数参数

       函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。


    栗子:

    对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。

    #include <stdio.h>
    int main()
    {	void swap(int *p1,int *p2);	//对swap函数的声明 
    	int a,b;
    	int *pointer_1,*pointer_2;	//定义两个int *型的指针变量
    	printf("please enter a and b:");
    	scanf("%d,%d",&a,&b);		//输入两个整数
    	pointer_1=&a;			//使pointer_1指向a
    	pointer_2=&b;			//使pointer_2指向b 
    	if(a<b) swap(pointer_1,pointer_2); //如果a<b,调用swap函数
    	printf("max=%d,min=%d\n",a,b); 	//输出结果
    	return 0;
    }
     
    void swap(int *p1,int *p2)			//定义swap函数
    {	int temp;
    	temp=*p1;					//使*p1和*p2互换
    	*p1=*p2;
    	*p2=temp;
    }
    

    说明:

       在函数调用时,将实参变量的值传送给形参变量,采取的依然是值传递的方式,因此 p1 的值为 &a,p2 的值为 &b。这时,p1 和pointer_1 都指向变量 a,p2 和 pointer_2 都指向变量 b,执行 swap函数体后,*p1 和 *p2 的值互换,相当于 a 与 b 的值互换。函数调用结束后,形参 p1 和 p2 不复存在 (被释放),此时,a 与 b 已经是交换后的值。

    注意:

    如果 swap 函数体写成以下这样就有问题了:

    void swap(int *p1,int *p2)			//定义swap函数
    {	int *temp;
    	*temp=*p1;					
    	*p1=*p2;
    	*p2=*temp;
    }
    

      *p1就是 a, 是整型变量。而 *temp 是指针变量 temp 所指向的变量。但由于未给 temp 赋值,因此,temp中的值是不可预见的,所以 temp 所指向的单元也是不可预见的。所以,对 *temp 赋值就是向一个未知的存储单元赋值,而这个存储单元可能存在着一个有用的数据,这样就可能破坏系统的正常工作状况。


    注意:

    不能企图通过改变指针形参的值而使指针实参的值改变。

    栗子:

    #include <stdio.h>
    int main()
    {	void swap(int *p1,int *p2);	//对swap函数的声明 
    	int a,b;
    	int *pointer_1,*pointer_2;	//定义两个int *型的指针变量
    	
    	printf("please enter a and b:");
    	scanf("%d,%d",&a,&b);		//输入两个整数
    	pointer_1=&a;			//使pointer_1指向a
    	pointer_2=&b;			//使pointer_2指向b 
    	
    	if(a<b) swap(pointer_1,pointer_2); //如果a<b,调用swap函数
    	
    	printf("max=%d,min=%d\n",a,b); 	//输出结果
    	return 0;
    }
     
    void swap(int *p1,int *p2)			//定义swap函数
    {	int *temp;
    	temp=p1;			
    	p1=p2;
    	p2=temp;
    }
    

      C语言中实参变量和形参变量之间的数据传递是单向的值传递方式。指针变量做函数参数同样要遵循这一规则。

    总结:

      不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指变量的值。


    拓展:

      函数的调用可以(而且只可以)得到得到一个返回值,而使用指针变量做参数,可以得到多个变化了的值。

    栗子:
    输入 a、b、c3 个整数,按大小顺序输出。

    #include <stdio.h>
    int main()
    {	void exchange(int *p1,int *p2, int *p3);   //对swap函数的声明 
    	int a,b,c;
    	int *pointer_1,*pointer_2,*pointer_3;	              //定义两个int *型的指针变量
    	
    	printf("please enter a b and c:");
    	scanf("%d,%d,%d",&a,&b,&c);		//输入两个整数
    	pointer_1=&a;			        //使pointer_1指向a
    	pointer_2=&b;			        //使pointer_2指向b 
    	pointer_3=&c;
    
    	exchange(pointer_1,pointer_2,pointer_3);
    
    	printf("The order is: %d,%d,%d\n",a,b,c); 	//输出结果
    	return 0;
    }
     
    void exchange(int *p1,int *p2, int *p3)			//定义swap函数
    {
    	void swap(int *pt1,int *pt2);
    	if(*p1 < *p2)   swap(p1,p2);
    	if(*p1 < *p3)   swap(p1,p3);
    	if(*p2 < *p3)   swap(p2,p3);
    }
    
    void swap(int *pt1,int *pt2)	
    {
    	int temp;
    	temp=*pt1;			
    	*pt1=*pt2;
    	*pt2=temp;
    }
    
    展开全文
  • #include <stdio.h> void Swap(int *x,int *y){ int temp; temp=*x; *x=*y; *y=temp; } main(void){ int a[3],b[3],i; printf("\n请输入数组a:"); for(i=0;i<... printf("%d",a[i
    #include <stdio.h> 
    
    void Swap(int *x,int *y){
    	int temp;
    	temp=*x;
    	*x=*y;
    	*y=temp;
    }
    
    main(void){
    	int a[3],b[3],i;
    	printf("\n请输入数组a:");
    	for(i=0;i<3;i++){
    		scanf("%d",&a[i]);
    	}
    	printf("\n数组a为:");
    	for(i=0;i<3;i++){
    		printf("%d",a[i]);
    	}
    	printf("\n请输入数组b:");
    	for(i=0;i<3;i++){
    		scanf("%d",&b[i]);
    	}
    	printf("\n数组b为:");
    	for(i=0;i<3;i++){
    		printf("%d",b[i]);
    	}
    	for(i=0;i<3;i++){
    		Swap(&a[i],&b[i]);
    	}
    	printf("\n交换后数组a为:");
    	for(i=0;i<3;i++){
    		printf("%d",a[i]);
    	}
    	printf("\n交换后数组b为:");
    	for(i=0;i<3;i++){
    		printf("%d",b[i]);
    	}
    }
    
    
    展开全文
  • 本文主要介绍在 C/C++ 编程语言中,指针变量作为函数参数的用法示例。 1 示例1 示例代码如下: #include <stdio.h> #include <stdlib.h> int main() { /* 函数声明 */ int swap(int *p1, int *...

    本文主要介绍在 C/C++ 编程语言中,指针变量作为函数参数的用法示例。

    1 示例1

    示例代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        /* 函数声明 */ 
        int swap(int *p1, int *p2);
        
        int a = 0;
        int b = 0;
        int i = 0;
        int *pointer_1 = NULL;
        int *pointer_2 = NULL;
        
        printf("please input a and b: ");
        scanf("%d %d", &a, &b);
        /* 交换前a和b的值 */
        printf("before swap: a=%d, b=%d\n", a, b);
        
        pointer_1 = &a;
        pointer_2 = &b;
        
        i = swap(pointer_1, pointer_2);
        /* 交换后a和b的值 */ 
        printf("after swap: a=%d, b=%d\n", a, b);
        
        system("pause");
        
        return 0;
    }
    
    /* 
    *  在此函数中实现指针变量的值的交换 
    */
    int swap(int *p1, int *p2)
    {
        int tmp = 0;
        
        tmp = *p1;
        *p1 = *p2;
        *p2 = tmp;
        
        return 0; 
    }

    上述代码运行结果如下:

    please input a and b: 11 33
    before swap: a=11, b=33
    after swap: a=33, b=11

    对于上述代码及其运行结果,说明如下:

    1. 指针作为函数参数时,实际上是将变量的地址传给函数;
    2. 需要注意:函数 swap 的形参的定义形式为“int *p1”;而调用该函数时,实参形式为指针(变量地址)“pointer_1”。
    3. 函数 swap 的作用是交换两个变量(a 和 b)的值,其实现方法是通过交换指针变量所指向的值(*p1 和 *p2),而并非交换指针变量自身值(p1 和 p2)。这是因为:函数参数传递的方式是“单向值传递”的“值传递”方式(指针变量作为函数参数也是遵循这一规则),形参值(p1 和 p2)的改变不能使实参的值(pointer_1 和 pointer_2)随之改变,即,受“单向值传递”约束的只是指针变量(pointer_1 和 pointer_2),而指针变量(pointer_1 和 pointer_2)所指向的值(a 和 b)并不受约束,因此,可以通过指针变量作为函数参数的方式,改变指针变量所指向的参数值;
    4. 函数的调用可以(而且只可以)得到一个返回值(即函数值),而运用指针变量作为函数参数,可以得到多个变化的值。

    2 示例2

    对于示例 1 中的 swap 函数的实现方法,给出有一个典型的错误示例,代码内容如下:

    /*
    * swap函数的错误示例 *
    */
    int swap_error(int *p1, int *p2)
    {
        int *tmp;
        
        *tmp = *p1;
        *p1 = *p2;
        *p2 = *tmp;
        
        return 0; 
    }

    上述代码在编译时不会报错,但运行时会直接导致程序崩溃。

    目前猜测此问题的原因:*tmp 是指针变量 tmp 所指向的变量,但 *tmp 中并无确定的值,因此 tmp 所指向的单元也是不可预见的。所以,对 *tmp 赋值有可能会对一个存储着重要数据的存储单元赋值,这样就会破坏系统的正常工作。

    备注:上面所述只是猜测,并未证实。后续可通过 GDB 调试等方式,进一步确认此问题原因。

    综上,建议如示例 1 那样,使用整型变量 tmp 作为临时变量来实现 *p1 和 *p2 的交换。

    展开全文
  • #include<stdio.h> #include<string.h> struct AGE { int year; int month; int day; }; struct STU { char name[20]; int num; struct AGE birthday;...void InputStu(struct ST...
  • 指针变量作为函数形参,编写函数实现2个实数的交换 函数接口定义: void mySwap(double*,double*); 裁判测试程序样例: 输入 测试数据有多组,处理到输入结束 输出 输出交换后的2个实数,保留2位小数。 每个输出...
  • C语言指针变量作为函数参数

    千次阅读 多人点赞 2018-10-26 09:34:27
    指针变量函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。 像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法...
  • C语言中指针变量作为函数参数

    千次阅读 2018-03-01 10:46:28
    函数调用只可以返回一个值,而使用指针变量作为参数,可以得到多个变化了的值。 #include<stdio.h> #include<string.h> void Statistics(char *str,int *p1,int *p2,int *p3,int *p4){ for...
  • #include <stdio.h> void main(void) { void swap(int *a,int *b); int a ,b ,*p,*q; p = &a; q = &b; printf("input a and b:"); scanf("%d %d",&a,&b);... if(*p&...
  • //输入3个整数,按从小到大的顺序写出来 ---用函数实现(指针变量作为函数参数) #include<stdio.h> void swap(int *p1,int *p2) { int temp; if( *p1<*p2) { temp=*p1; *p1=*p2; *p2=temp; } ...
  • /* 2015年8月28日13:20:28 通过函数完成对结构体变量的输入和输出*/# include &lt;stdio.h&gt;# include &lt;string.h&gt;struct Student{ int age; char sex; char name[100];}; //分号不能省void ...
  • #include void swap(int *p1,int *p2); int main() { int a,b; int *pointer_1,*pointer_2; printf("please enter a and b:"); scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b;... swap(pointer_1
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • #include <...//声明函数 int FindMin(int array[],int n,int *MinPos);//声明函数 main(void){ int array[10],MaxValue,MinValue,MaxPos,MinPos,i; printf("请输入数组:"); for(i=0;i<N
  • 人之所以痛苦,那是因为你在成长。--------magic_guo C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。用指针变量函数参数同样要遵循这一规则。...//指针变量作为函数参数, 改变...
  • #include &lt;stdio.h&gt; #include &lt;string.h&gt; ...struct student { ...void inputstudent(struct student *ps)//对结构体变量输入时必须传地址 { (*ps).age = 10; strcpy(ps-&gt;n...
  • 转自百度知道: 思考:为什么两个运行结果不同 ...C语言使用值传递时,仅仅将实参的值传递给形参。...a所在的地址里面的值,也就是a本身的值了,所以第一种写法main函数调用Swap函数之后,a和b的值会发...
  • 数组名,指针变量函数参数的四种情况 2016年10月02日 13:43:49 阅读数:2154 函数的参数可以是变量,也可以是数组。当整个数组作为函数的参数时,实际上是数组的地址作为参数。由于实参可以是表达式,数组元素...
  • c++之指针作为函数参数传递的问题

    万次阅读 多人点赞 2018-09-30 11:23:51
      原创文章,转载请注明出处,谢谢! 作者:清林,博客名:飞空静渡 ...其实,对于C 或者C++ ,最难的一块地方估计就是指针了。指针是强大的,但也是很多人载在这里的地方。   前段时间写了一篇文章《...
  • 指针变量作为函数参数和一般变量作为函数参数是有区别的,对于这种区别初学者一般都很迷惑。下面我将就一个简单的例子来说明一下它们的区别。看透以后也许也就不那么疑惑了。# include void main(){ void swap1(int...
  • 函数指针变量作为函数形参

    千次阅读 2020-09-07 12:17:53
    所以,函数指针变量是一种变量类型,也可以作为函数的形参变量。程序测试例子如下: 程序运行结果如下: 可以看到,函数func1的定义如下: voidfunc1(void(*pfunc)(int)) 其中形参的定义是 void(*pfunc...
  • 问题描述 用指针变量作为函数参数,接收从数组传来的数组元素首地址,以冒泡排序为例
  • 指针变量函数参数作返回值A

    千次阅读 2019-06-11 11:02:45
    大家都知道函数返回值可以返回数据给调用者,也有必要掌握使用指针变量作为函数参数充当函数返回值的方法。请你帮助叮当定义形如下面的函数: void fun(int a, int b, int *sum, int *diff, int *product, float *...
  • 返回值类型 函数名(类型 *指针变量名){ 函数体;  } 如: void changeNum(int *pInt){ printf("这个数是:%d",*pInt); *pInt = 30; //这里修改指针指向的空间里的值后,主调函数外面的值也就修改了  } ...
  • C语言指针作为函数参数传递学习(一)

    万次阅读 多人点赞 2018-12-01 00:18:34
    1. 数组或者一维指针函数形参 1.1传入的指针为NULL 比如下面的例子,很多人都会理解错: #include &amp;lt;stdio.h&amp;gt; void test(char *string) { string = &quot;hello world&quot;; } ...
  • 关于指针作为函数参数传递的理解

    千次阅读 2019-04-23 17:30:01
    本来已经把指针和引用的知识都捋清楚了,但是中午编程遇到了一个传递数组的问题,一下想得多了点,然后又。。。。 被值传递,指针传递,引用传递,地址传递这几个概念弄晕了。看了十来篇博客,什么说法都有。参考...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 749,776
精华内容 299,910
关键字:

指针变量作为函数参数