第10章 指针(七) 应用1------函数间数据的双向传递

简介:         声明:文中观点仅代表个人,其中文字、图片未经本人许可,不得部分或全部转载,违者所造成影响后后果自负!联系本人方式:80368704@qq.

 

       声明:文中观点仅代表个人,其中文字、图片未经本人许可,不得部分或全部转载,违者所造成影响后后果自负!联系本人方式:80368704@qq.com QQ:80368704
       
       忠告:函数
概念过关的往下看,否则回到函数的相关章节去!!!!!
       忠告:指针
概念过关的往下看,否则回到指针的前面六节去!!!!!
       警告:上述2个内容 没有过关的,往下看,无异于对你学习指针信心的自杀!因为在下面,我将不再把你当作最初级的程序学习者,不再做最初级的解释了,我假设,你已经是进阶者!

       函数的参数不仅可以是整型、实型、字符型等数据,还可以是变量的指针,它将一个变量的首地址从主调函数传送到另一个函数中,以间接的方式,实现了函数间数据双向传递。 谭浩强先生用一个简单的例子: 输入两个整数, 按大小顺序输出, 函数处理 ,说明了指针的这类应用

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

swap(int *p1,int *p2)
{
   int temp;

   temp=*p1;
   *p1=*p2;
   *p2=temp;
}

main() {

int a,b;
    int *pointer_1,*pointer_2;

    scanf("%d,%d",&a,&b);
    pointer_1=&a;pointer_2=&b;
    if(a<b)
          swap(pointer_1,pointer_2);
    printf("/n%d,%d/n",a,b);
}


对程序的说明:
       swap是用户定义的函数,它的作用是交换两个变量(ab)的值。swap函数的形参p1p2是指针变量。程序运行时,先执行main函数,输入ab的值。然后将ab的地址分别赋给指针变量pointer_1pointer_2,使pointer_1指向apointer_2指向b

 

      接着执行if语句,由于ab,因此执行swap函数。注意实参pointer_1pointer_2是指针变量,在函数调用时,将实参变量的值传递给形参变量。采取的依然是值传递方式。因此虚实结合后形参p1的值为&ap2的值为&b。这时p1pointer_1指向变量ap2pointer_2指向变量b

 

      接着执行执行swap函数的函数体使*p1*p2的值互换,也就是使ab的值互换。

 

函数调用结束后,p1p2不复存在(已释放)如图。

 

最后在main函数中输出的ab的值是已经过交换的值。

进一步分析如下:
       表面上看,由于a和b是main()的局部变量,他们的作用域就是main()的函数体,因此a,b对于swap()是不可见的,即swap()不能对a和b赋值,也不能使用a和b中的数据进行运算;
       但是,
当我们通过使用指针参数pointer1和pointer2将&a、&b这2个地址从main()传入了swap();那么,swap()通过该地址,就可以找到main()的a,b,从而使得swap()就象main()一样,可以直接对a、b赋值,或直接用a、b中的值进行运算。
       这样一来,主调函数main()可以存取a、b,而被调函数swap()通过传入的地址,也可以存取a、b。我们说a、b在main()和swap()间被共享了。
       既然变量都被共享了,那么main()就可以通过a、b给swap()传送数据;同理swap()也可以通过a、b给main()传送数据了,这就是说,我们实现了这2个函数间的双向数据传递。
       恰可谓明修栈道,暗渡陈仓!!!


2、请注意交换*p1*p2的值是如何实现的。请找出下列程序段的错误

swap(int *p1,int *p2)
{int *temp;
*temp=*p1;      /*
此语句有问题*/
*p1=*p2;
*p2=temp;
}

       上面的错误在于int *temp是一个野指针!!!当你定义了一个指针A,但是没有明确指定A指向哪个变量,那么A就叫野指针;

       一定要给你的指针变量赋初值,不要让他成为野指针,否则他会桀骜不驯,成为一个很危险的东西。

       遥想当年,他搞死过我的程序,也使我的系统死过机,甚至摧毁了我的操作系统.......;你要格外小心,不要让世界末日降临。

3、请考虑下面的函数能否实现实现ab互换。

swap(int x,int y)

{int temp;

temp=x

x=y;

y=temp;

}


如果在main函数中用swap(a,b)调用swap函数,会有什么结果呢?请看下图所示。

 

上面的分析,再次验证了函数参数的单向值传递原则!!!

4、【例】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。

swap(int *p1,int *p2)

{int *p;

p=p1;

p1=p2;

p2=p;

}

main()

{

int a,b;

int *pointer_1,*pointer_2;

    scanf("%d,%d",&a,&b);

    pointer_1=&a;pointer_2=&b;

    if(a<b) swap(pointer_1,pointer_2);

         printf("/n%d,%d/n",*pointer_1,*pointer_2);

}

 

其中的问题在于不能实现如图所示的第四步(d)。

 

       函数使用指针作为参数时,作为函数参数的一种,指针参数仍然也必须遵守单向值传递的原则,即指针参数中地址在被调函数中的改变,不会返回到主调函数

 
相关文章
|
2月前
|
存储 C语言 C++
如何通过指针作为函数参数来实现函数的返回多个值
在C语言中,可以通过将指针作为函数参数来实现函数返回多个值。调用函数时,传递变量的地址,函数内部通过修改指针所指向的内存来改变原变量的值,从而实现多值返回。
|
2月前
|
存储 搜索推荐 C语言
如何理解指针作为函数参数的输入和输出特性
指针作为函数参数时,可以实现输入和输出的双重功能。通过指针传递变量的地址,函数可以修改外部变量的值,实现输出;同时,指针本身也可以作为输入,传递初始值或状态。这种方式提高了函数的灵活性和效率。
|
2月前
利用指针函数
【10月更文挑战第2天】利用指针函数。
18 1
|
2月前
|
算法 搜索推荐 C语言
【C语言篇】深入理解指针4(模拟实现qsort函数)
【C语言篇】深入理解指针4(模拟实现qsort函数)
24 2
|
3月前
|
传感器 物联网 大数据
C 指针在物联网的应用
在物联网(IoT)中,C 语言及其指针功能广泛应用于嵌入式系统。C 指针在内存管理、设备驱动、数据结构处理、传感器通信等方面发挥关键作用,如动态分配内存、直接访问硬件寄存器、传递复杂数据结构等,有效提升了资源受限环境下的性能和灵活性。通过函数指针和省电模式管理,还能实现事件驱动编程和节能目标,使 C 语言成为 IoT 开发的重要工具。
67 12
|
3月前
|
存储 安全 C语言
C语言 二级指针应用场景
本文介绍了二级指针在 C 语言中的应用,
|
3月前
|
Linux
在Linux内核中根据函数指针输出函数名称
在Linux内核中根据函数指针输出函数名称
|
4月前
|
程序员 C语言
指针在函数参数和返回值中的使用
指针在函数参数和返回值中的使用
52 9
|
2月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
28 0
|
3月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。