5

t在为 赋值之前,是否必须在以下代码中进行初始化t?代码是否正确?

void swap(int *x, int *y)
{
    int *t;
    *t = *x;
    *x = *y;
    *y = *t;
}
4

7 回答 7

9

您不需要指针开头:

void swap(int *x,int *y)
{
    int t; //not a pointer!
    t=*x;
    *x=*y;
    *y=t;
}
int a = 10, b = 20;
swap( &a, &b); //<-----------note : Needed &

--

或者,您可能需要以下交换功能:

void swap(int & x,int & y) //parameters are references now!
{
    int t; //not a pointer!
    t=x;
    x=y;
    y=t;
}
int a = 10, b = 20;
swap(a,b); //<----------- Note: Not needed & anymore!
于 2011-03-23T10:35:43.357 回答
8

以下代码部分是否正确?

不!您的代码调用未定义的行为,因为您试图取消引用一个野指针。

 int *t;
 *t=*x; // bad

试试这个

 int t; // a pointer is not needed here
 t=*x; 

或这个

int *t = x; // initialize the pointer

于 2011-03-23T10:35:16.410 回答
5

该代码包含未定义的行为:

int *t;
*t=*x; // where will the value be copied?

除此之外,它没有任何意义——你需要一个临时变量来存储值,而不是指针。

int t; // not a pointer
t=*x;
*x=*y;
*y=t;
于 2011-03-23T10:35:28.693 回答
1

你可以在这里找到正确的方法

#include <stdio.h>

void swap(int *i, int *j)
{
    int t;
    t = *i;
    *i = *j;
    *j = t;
}

基本上,sharptooth 已经向您解释了原因,但是您会在那里找到更多细节和解释,了解当您进行此类交换时在后台会发生什么。希望它有助于清除您的想法。

于 2011-03-23T10:40:06.367 回答
1

对于指针来说是正确的。

只有引用需要在声明时初始化(或在实例成员的构造函数中)。

编辑:但是你的代码中有错误,你不应该取消引用你的参数(即int *ptr = otherPtr;很好,不是int *ptr = *otherPtr;

于 2011-03-23T10:35:51.980 回答
1

如果你只是想让你的指针指向已经初始化的数据,那么你不需要初始化它。但是,您这样做的方式是,是的,您想使用其中一个 malloc 函数来为整数分配足够的堆空间。

在 C/C++ 中进行交换的正确、有效的方法是

void swap(int *x, int *y) {
    int *t = x;
    x = y;
    y = t;
}
于 2011-03-23T10:38:51.490 回答
0
int *t;
*t=*x;

t没有指向任何可以取消引用的有效位置。

在将值分配给指针 t 之前是否必须进行初始化。

是的,初始化/分配指向一个有效的内存位置。否则它会指向哪里。它可能会指向垃圾并导致取消引用未定义的行为

于 2011-03-23T10:36:25.863 回答