回 帖 发 新 帖 刷新版面

主题:请问下面一个一个小函数为什么不行? 30分

请问下面一个一个小函数为什么不行? 是不是指针p没有分配内存空间?

void swap(int *p1, int *p2)
{     
           int *p; 
    *p = *p1;
    *p1 = *p2;
    *p2 = *p;

}

回复列表 (共9个回复)

沙发

楼主说的对,*p就开空间后使用。
传过来的参数p1和p2也要保证开辟空间后使用。

板凳

这个问题在谭浩强出的C语言程序设计 Page 164页有详细解释。
C语言中实参变量和形参变量之间的传递是单向的“值传递”方式。指针变量做函数参数也要遵循这一规则。调用函数不能改变实参指针变量的值,但是可以改变实参变量所指变量的值。

3 楼

c++6.0的话和他本身已有的 swap函数冲突了

4 楼

void swap(int *p1, int *p2)
{     
           int temp; 
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;

}

5 楼

其实 参数里面定义了指针变量的话,
表达式里不应该再加*(要是你想要交换地址的话)
还有 实参传递的数据类型也应该要对应是地址 个人对楼主意图猜测如下
#include "stdio.h"
void swap(int *p1, int *p2);
void main()
{int a=2,b=3;
 swap(&a,&b);
 printf("%d,%d",a,b);
    
}
void swap(int *p1, int *p2)
{     
   int p; 
    p = *p1;
   *p1 =*p2;
   *p2 =p;
}
这个函数传递的是地址 而swap是对地址的内容进行修改 也就是a的地址放了3 b的地址放了2 从而实现了形参实参的“双向传递”
希望对楼主有帮助

6 楼

你究竟想交换什么? 指针还是数据?
函数有2个指针参数
实参应该是地址
P是指针 可以用
*P是指针所指数据 你没给
同样*P1 *P2也是

7 楼

你定义了一个int *p.
这个指针指到哪儿还不晓得。

8 楼

在没有对指针变量赋初值以前,指针变量存储的地址值是不确定的,它存储的地址可能是操作系统程序在内存中占据的地址空间中的一个地址,可能是某一常驻系统的应用程序占据地址空间的一个地址,也可能是内存中还没被分配使用的一块空间的地址。因此,没有对指针变量赋地址值而直接使用指针变量p进行*p=表达式;形式的赋值运算可能会产生不可预料的后果,甚至会导致系统不能正常运行。
     一般情况下我们采用: int temp; 
                         temp = *p1;
                         *p1 = *p2;
                         *p2 = temp;进行赋值,从而交换值。但是,如果楼主你想采用你那种用指针变量坐中间变量也可以,你只要先给p赋一个地址值就可以了,如:
                                                                int m=10;
                                                                p=&m; 
                                                                *p = *p1;
                                                                *p1 = *p2;
                                                                *p2 = *p;这样就可以了。

9 楼

void swap(int *p1, int *p2)
{     
           int t; 
    t = *p1;
    *p1 = *p2;
    *p2 = t;

}

我来回复

您尚未登录,请登录后再回复。点此登录或注册