C语言函数传递指针 为什么函数fun无法修改指针p 应该怎么改?(这是重点) 谢谢

发布网友

我来回答

5个回答

热心网友

#include<stdio.h>

char *fun(char *x,char *y)

{

    printf("%p %p\n",x,y);

    x=y;

    printf("%p %p\n",x,y);

    return x;        //此处返回地址就可以了;

}

int main(void)

{

    char s[]="abc";

    char *p,*q;

    p=NULL;

    q=s;

    printf("%p %p\n",p,q);

    p=fun(p,q);        //将fun函数返回的地址赋值给P就可以了

    printf("%p %p\n",p,q);

    return 0;

}

 

热心网友

你好。因为func参数是指针类型,传入也是指针类型,所以只是一般的值传递。值传递是传入输入参数的拷贝。因此不能修改p的值。
改成引用模式。void fun(char* &x, char* &y)就好了。

热心网友

因为你改的是指针的变量,不是指针指向的内容。如果想更新传入的指针,那就可以用指向指向的指针来修改。
void fun(char **x, char **y) {
printf("%p %p\n", *x, *y);
*x = *y;
printf("%p %p\n", *x, *y);
}

int main(void) {
char s[] = "abc";
char *p, *q;
p = NULL;
q = s;
printf("%p %p\n", p, q);
fun(&p, &q);
printf("%p %p\n", p, q);
return 0;
}

热心网友

main中第一个printf输出00000000 0012FF44
然后调用fun函数实参p为00000000,q为0012FF44,传递给形参,形参在栈上重新开辟一块内存,是实参的拷贝副本,x=00000000,y=0012FF44,fun函数的第一个printf输出为
00000000 0012FF44,然后执行x=y,此时x=0012FF44, y=0012FF44,执行第二个printf后输出
0012FF44 0012FF44,然后释放fun函数,也就把fun函数的变量,包括x,y释放,x与y只是p和q的副本,和p,q无关,p和q是main函数内存区的变量,只有在main函数结束后才会释放,所以main中第二个printf输出00000000 0012FF44

热心网友

C语言 本身使用值传递机制,也就是导致了任何情况下,形参的变化都不会影响到实参本身(C++有引用,可以解决这个问题)
此处需改为二级指针

#include<stdio.h>
void fun(char **x,char **y)//
{
*x=*y;//
}
int main(void)
{
char s[]="abc";
char *p,*q;
p=NULL;
q=s;
printf("%p %p\n",p,q);
fun(&p,&q);//
printf("%p %p\n",p,q);
return 0;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com