首先你要认识函数传参是怎么进行的
函数传参是复制形的,举个例子说:
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);一样