c语言中指针作为形参,代码如下:

2024-12-03 02:34:37
推荐回答(4个)
回答1:

你要用*去解引用,这样才能改变指针指向内存的值。
你的swap函数写的有问题,正确的写法有人给了。
至于为什么*x,*y的值没有改变,因为你交换的是2个形参的值,虽然你传入的是指针,但是你没有把它们当成指针来用,最后的结果跟传非指针值是一样的。
如果想真正改变实参的值,就必须交换指针指向的内存,而不是单纯交换指针变量本身。形参是通过堆栈传递的,只有用类似 *x = 1;这样的语句操作指针指向的内存,才能影响到实参,否则实参的值是不会改变的。
其实最好的方式就是去VS里调试运行,仔细观察运行过程,就能比较清晰地了解指针。单纯的理论是站不住脚的,拉出来溜溜就一清二楚了。
想对你能有帮助。

回答2:

#include
  
  void swop(int *x, int *y)
  {       
          int t; 
          t = *x;
          *x = *y;
          *y = t;
  }
  int main(void)
  {       
         int a = 3;
         int b = 4;
         int *x = &a;
         int *y = &b;
         swop(x,y);
         printf("%d %d",*x,*y);

        return 0;
 }

 你的交换函数有问题,首先交换顺序就错了,指针传递的是地址,t 要是值,才能将指针指向地址所代表的值进行交换

回答3:

首先,void swop(int *x, int *y)传进是指针没错,但是,参数你可以这样理解,int* 是类型 x,y 是参数,

所以是传进swop的还是 x,y (x,y其实是数据所在的地址),亦是说,swop函数里交换你可以将
x y 地址指向的数据交换(t = *x ;*x=*y;*y=t ),但就不能交换 x,y 本身。

说得不清楚,写个例子吧
int add(int a,int b) 与int add(int * a, int *b);
这两者的参数类型是 int 与 int *

既然 第一个int add(int a,int b) 里的 a b 不能修改,那么 第二个int add(int * a, int *b)里的 a b 也肯定不能修改的咯

回答4:

#include

void swop(int *x, int *y)
{
int *t = NULL;
t = x;
x=y;
y= t;
printf("%d\n",x);
printf("%d\n",y);
}
int main(void)
{
int a = 3;
int b = 4;
int *x = &a;
int *y = &b;
printf("%d\n",x);
printf("%d\n",y);
swop(x,y);
printf("%d\n",x);
printf("%d\n",y);
printf("%d%d",*x,*y);

}
拿去试试你就知道了,为什么了,注意观察内存地址的变化
swap函数接收的只不过是原先x y中的内容,而这个内容,就是 3,4 的地址,对吧
swap将得到的地址进行交换,swap函数在栈上执行,执行完就销毁了,不会影响到真正的3 和4,
你再看看这个,传过去的是x,y的地址,swap就能通过这个x y的地址找到 3 4的地址,这样就能真正的操作到3 4 了
#include

void swop(int **x, int **y)
{
int *t = NULL;
t = *x;
*x=*y;
*y= t;
printf("%d\n",x);
printf("%d\n",y);
}
int main(void)
{
int a = 3;
int b = 4;
int *x = &a;
int *y = &b;
printf("%d\n",x);
printf("%d\n",y);
swop(&x,&y);
printf("%d\n",x);
printf("%d\n",y);
printf("%d%d",*x,*y);

}
一楼的解释更加清楚明白