外贸网

  • 首页
  • C语言 指针做函数参数 的优点 c语言中用指针变量做函数参数有什么意义?

    作者:媒体   更新日期:2024.05.19
    首先你要认识函数传参是怎么进行的

    函数传参是复制形的,举个例子说:

    void modify(int a)
    {
    a++;
    }

    void main()
    {
    int a=5;
    modify(a);
    printf("%d",a);
    }
    这个程序的答案还是5。为什么?
    因为当调用modify(a)时,在执行modify函数时,是另外开辟了一个内存空间,将main中a的值复制过来,modify函数中所有的操作都是相对于这个新开辟的内存空间而言的,对原来的a没有任何改变。

    现在就来说说指针,如果用指针传参的话那就完全不一样了,指针(pointer),说白了即是指向变量内存地址。同样上面的例子:
    void modify(int * a)
    {
    (*a)++;
    }

    void main()
    {
    int a=5;
    modify(&a);
    printf("%d",a);
    }
    这个答案当然是6
    因为你传进去的是a的地址,所以在modify函数中的操作都是对a地址上的内容进行操作,即是操作a所以modify函数不用返回这个数,main中a的值也会改变。因为大家都是操作同一个内存空间,而上面不用指针,modify操作的是另一个新开辟的内存空间,只是这个内存空间初始值和a一样。

    现在来说说传参,其实你“为什么函数参数是字符串的多用指针?” 那句我不是很明白,C中的字符串传参好像就指针一种形式(除非用结构体)。
    何时用指针,何时用拷贝。当传的参数是一个结构体,而这个结构体比较大,这时最好用指针,因为如果用拷贝的话,单单花在拷贝的时间就要浪费很多,而如果这个函数经常被调用,那么这效率问题就出现了。

    你在子函数中要对你的主调用函数中变量进行操作时也可以用指针做参数,这样子函数就可以不用return 如果不是用指针的话,就要再子函数的未尾加上一条return x;把这个数返回当返回值。

    多看点书,多写点程序,刚开始学都会对指针比较迷茫。写多了,自然而然就懂了。

    指针说白了就是地址,内存变量的地址。
    指针作参数说不上有什么优点。就是当你在子函数中要对你的主调用函数中变量进行操作时就必须用到指针做参数,也就是把主调用函数中变量的地址传到被调用函数中去,这样才能实现对主调函数变量的操作。如果不是用指针变量,而是一个普通变量的话是无法传递主函数的变量地址的,这里涉及到函数的传值和传址的区别。如果不了解这个最好找个书看看,一定要仔细理解。

    对于你的“为什么函数参数是字符串的多用指针?”这句话我不是太理解。
    至于何时该用指针何时不该用,我上面已经说清楚了。如果你是C语言的初学者可能会不太理解,那么你就仔细去研究一下教材吧。

    优点:
    1.允许用户可以直接操作内存(可以在函数内部修改变量值)
    2.传递参数的效率更高(尤其是像数组、大型结构体、链表这样的数据结构),因为普通的参数传递是为参数制造一个副本,这会产生不容忽视的内存开销,而且制造一个副本也会占用不少的CPU时间
    3.许多数据结构的实现都必须靠指针来实现(比如链表)

    第一,可以用指针修改指针指向的变量,否则只改变此变量的拷贝
    第二,利用指针的指针增加安全性
    “字符串的多用指针”是指char *argv[]吧

    1,回调函数,例如signal(int,sighandler_t)
    动态改变调用
    void sort(void* beg,void*end,bool(*compare)(viod *a,void*b) );

    2字符串数组当参数会自动变成指针
    int foo(char a[]);
    int foo(const char* a);一样

    c语言中用指针变量做函数参数有什么意义?

    看你的需要了,有时不用指针作为参数达不到你要的效果,比如一个swap()函数。
    int
    swap(int
    a,int
    b)
    {
    int
    tmp;
    tmp=a;
    a=b;
    b=tmp;
    }
    如果你想调用该函数交换两个变量的值,在主函数中输出,那是不可能的。比如这样调用:
    int
    x=1,y=2;
    swap(x,y);
    printf("%d
    %d",x,y);
    你认为会输出2
    1吗?错!还是会输出1
    2的。因为传入swap()函数的只是x,y的拷贝,而不是它们自身。
    如果要真正达到交换的目的,就要用指针传值。这样定义函数:
    void
    swap(int
    *a,int
    *b)
    {
    int
    tmp;
    tmp=*a;
    *a=*b;
    *b=tmp;
    }
    但是给函数传值时要注意,指针是指向地址的,所以参数要是地址,即需要给变量取地址。
    int
    x=1,y=2;
    swap(&x,&y);
    printf("%d
    %d",x,y);
    这样就是输出2
    1了!

    你上面那一段话,对于初学者来说确实坑爹,说的像什么官方话语,我看着也就只能理解个模糊大概。先给你举个例子吧,函数指针的写法int*p;inta;p=&a;//这是一般整型指针#includeusingnamespacestd;intarr(inta,intb){return0;}//比如说是函数1intbrr(inta,intb){return1;}//比如说是函数2intmain(){int(*frr)(int,int);//这里就是函数指针frr=arr;//它可以指向arrcout<