设为首页 加入收藏

TOP

C语言函数传递指针参数的问题详解(一)
2018-05-21 15:48:31 】 浏览:518
Tags:语言 函数 传递 指针 参数 问题 详解

C语言函数传递指针参数的问题

一个问题是,我们想用一个函数来对函数外的变量v进行操作,比如,我想在函数里稍微改变一下这个变量v的值,我们应该怎么做呢?又或者一个常见的例子,我想利用swap()函数交换两个变量a,b的值,我们应该怎么做呢(好吧,博主是觉得这个问题十分经典)。

如果你真的理解C语言中【函数】这个工具的本质,我想你稍微仔细的思考一下,可能就不会来查看博主的这篇文章,对函数来说,它所传递的任何参数仅仅是原来参数的一个拷贝,所以,对任何企图通过void swap(int a,int b)来交换a,b值或者想通过void alter(int v)来改变v的值,都是徒劳的。

C语言里,改变值只能通过指针(地址)方式进行传递,或许你会说传递数组不是也可以改变值么,实际上,传递数组就是传递指针(或许对数组来说,这个指针有点特别)//注意:C里没有引用,C++里才有

我们先来看一下有趣的swap函数,它用于交换a,b两个变量

code case 1

#include 
  
   
void swap(int a,int b)
{
    int temp=a;
    a=b;
    b=temp;
}
int main()
{
    int a=4,b=5;
    swap(a,b);
    printf("a = %d ,b = %d\n",a,b);
    return 0;
}
  

不出意料的,我们会知道这段代码其实并不能得到我们想要的结果,它并不能交换两个变量a,和b,的值,这是为什么?

我们不妨修改这段代码,在main()和swap()里分别打印a和b的地址,看看到底发生了什么;我们修改代码如下:
code case 2

#include 
  
   
void swap(int a,int b)
{
    printf("address in swap():%p %p\n",&a,&b);
    int temp=a;
    a=b;
    b=temp;
}
int main()
{
    int a=4,b=5;
    printf("address in main():%p %p\n",&a,&b);
    swap(a,b);
    printf("a = %d ,b = %d\n",a,b);
    return 0;
}
  

它的运行结果为:

address in main():0061FF2C 0061FF28
address in swap():0061FF10 0061FF14
a = 4 ,b = 5

显然,在两个函数里,它们的地址并不相同,这意味着,它们并不是相同的存储空间,改变swap里的值,实际上仅仅只改变了swap()里面的a和b的值罢了,一旦swap执行完,swap里的a和b的储存空间立即释放掉,对于main()里的a和b,没有半点影响。

那么在C语言里如何才能交换两个变量的值呢?
方法是通过指针传参,看下面的代码
code case 3

#include 
  
   
void swap(int *a,int *b)
{
    printf("address in swap():%p %p\n",a,b);
    int temp=*a;
    *a=*b;
    *b=temp;
}
int main()
{
    int a=4,b=5;
    printf("address in main():%p %p\n",&a,&b);
    swap(&a,&b);
    printf("a = %d ,b = %d\n",a,b);
    return 0;
}
  

运行结果为:

address in main():0061FF2C 0061FF28
address in swap():0061FF2C 0061FF28
a = 5 ,b = 4

这样,就把a,b的值交换了!
等等,我们分析一下它的原理,它究竟做了哪些变化呢,在swap函数里,我们将a和b的地址给了swap函数,作为形参,在swap函数中,a和b是指向两个int 类型的指针,它们接受了main里面a和b的地址,也就是a=&a (in main());b=&b (in main());所以对*a实际上就是对a(in main())操作啦;
那么,聪明的你肯定能想到,在swap()函数里变量a和b的地址肯定和main里a和b的地址是不同的,swap里的a,b的地址是指针的地址(在swap里a,b是指针),而它们的值是在main()里面a和b的地址;
我们不妨打印一下swap里a,b和地址就明白了;
code case 4

#include 
  
   
void swap(int *a,int *b)
{
    printf("address in swap(),the value of a and b:%p %p\n",a,b);
    printf("address in swap(),the address of a and b:%p %p\n",&a,&b);
    int temp=*a;
    *a=*b;
    *b=temp;
}
int main()
{
    int a=4,b=5;
    printf("address in main(),the address of a and b:%p %p\n",&a,&b);
    swap(&a,&b);
    printf("a = %d ,b = %d\n",a,b);
    return 0;
}
  

运行结果:

address in main(),the address of a and b:0061FF2C 0061FF28
address in swap(),the value of a and b:0061FF2C 0061FF28
address in swap(),the address of a and b:0061FF10 0061FF14
a = 5 ,b = 4

通过结果我们知道,在swap里,指针a和b的值和main()里的a和b的地址是一样的,那么对*a进行的各种赋值实际上就是对main()里的a的各种操作,它们代表同一储存空间的的值;但是对swap里的a,和b的地址,和main里的是不一样的,这是显然的,a只是一个容纳&a地址的变量罢了,它是swap里重新分配的一块内存,并且,它的类型和main里的a,b类型完全不同,它是一个指针类型;

用比喻的方法来讲,在多行书架上,每行各自放了一本书,现在我想把a,b这两本书交换一下位置,我想让你帮我交换一下,你要怎么做呢?好了,我告诉你a书在第一行书架上,b在第四行书架上,现在,你可以做了吧,你首先会取出第一行的a书,将其拿出放在左手,然后用右手取出位于第四行的b书,放在第一行上,再将位于左手上的a书放到第四行上,至此,交换完成。
仔细想想,在这个过程中你不就相当于充当了swap这个函数的作用吗?我告诉了你a,b的地址,你真正交换了它

当然,我想探讨的并不是只有这些,在文章一开始,我就引入了这样的话题,我们先看一下这段代码问题:

#include 
  
   
#include 
   
     typedef struct LNode
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C小程序—二级指针的第三种内存模.. 下一篇怎么用C语言实现一个通讯录?

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目