在C++中,初始化指针是强制性的吗?

5

在给t赋值之前,是否必须初始化以下代码中的t?这段代码正确吗?

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

你可能需要重新表述一下你的问题。虽然所有回答都是正确的,但下面有一些看似矛盾的回答。给未初始化的指针赋值是完全合法的,但对其进行解引用则不是。你的代码片段进行了解引用,但你的问题是关于赋值的。 - Damon
顺便说一句,有一个定义好的“swap”函数(模板),但它与你在这里所做的具有不同的语义。您确定要通过更改语义来混淆用户吗? (使用您的实现:swap(p,q)等同于std::swap(*p,*q),但不是std::swap(p,q),后者将交换指针而不是内容) - David Rodríguez - dribeas
我知道我们可以使用一个简单变量来存储 x 指向的值,然后进行交换。但我只是在尝试是否可以使用指针来存储该值,而非简单变量。 - Baali
而且这段代码很好用,如果我把指针初始化为0的话。 - Baali
int *t = 0; *t = *x; *x = *y; *y = *t; - Baali
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!

1
他的问题不是“如何交换两个变量的值?”。 - Prasoon Saurav
@Prasoon:我知道。但是我正在告诉他他所拥有的替代方案,并且可以进行实验,因为其他答案已经解释了他的情况! - Nawaz

8
以下代码段是否正确?
不正确!您的代码会引发未定义行为,因为您试图解引用一个野指针。
 int *t;
 *t=*x; // bad

尝试这个方法:
 int t; // a pointer is not needed here
 t=*x; 

或者是这个

int *t = x; // initialize the pointer


5

这段代码存在未定义的行为:

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

此外,这样做没有意义 - 你需要一个临时变量来存储值,而不是指针。
int t; // not a pointer
t=*x;
*x=*y;
*y=t;

1

如果你只想让指针指向已经初始化的数据,那么就不需要初始化它。但是你需要使用malloc函数之一来分配足够的堆空间以存放一个整数。

C/C++中适当且高效的交换方式是

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

这也是我会这样做的方式。我尽量不让指针未初始化,如果我已经有另一个指针想要赋值给它,那么我就无论如何都会将其初始化为该值。 - Mephane

1

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

#include <stdio.h>

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

基本上,sharptooth已经向您解释了原因,但在那里您会找到更多有关进行此类交换时背景中发生的情况的细节和解释。希望这有助于澄清您的想法。


1

指针的使用是正确的。

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

编辑:但是你的代码存在错误,你不应该对参数进行解引用操作(例如,int *ptr = otherPtr; 是可以的,而不是 int *ptr = *otherPtr;


解除引用未初始化的指针是未定义行为。 - Björn Pollex
我只是回答了原帖的问题,没有检查整个代码块。问题是声明一个指针而不进行赋值是否有效,这是有效的。 - jv42
@Tomalak 不确定你的意思是什么?int var, *ptr = &var; 是有效的。 - jv42
@jv42:是的,但这不是赋值。 - Lightness Races in Orbit

0
int *t;
*t=*x;

t 没有指向任何有效的位置,因此无法进行解引用。

在给指针 t 赋值之前,是否必须进行初始化?

是的,需要将其初始化/赋值为指向有效内存位置的指针。否则它可能会指向垃圾并导致未定义行为解引用时发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接