发布网友
共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;
}