是否必须在C ++中初始化指针?

时间:2011-03-23 10:33:52

标签: c++ c pointers dangling-pointer

在将值分配给t之前,是否必须在以下代码中初始化t?代码是否正确?

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

7 个答案:

答案 0 :(得分: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 :(得分:8)

  

以下代码部分是否正确?

Nopes!您的代码调用未定义的行为,因为您正尝试取消引用野生指针。

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

试试这个

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

或者

int *t = x; // initialize the pointer

答案 2 :(得分:5)

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

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

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

int t; // not a pointer
t=*x;
*x=*y;
*y=t;

答案 3 :(得分:1)

指针是正确的。

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

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

答案 4 :(得分:1)

如果您只想让指针指向已初始化的数据,则无需初始化它。但是,您可以使用其中一个malloc函数为整数分配足够的堆空间。

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

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

答案 5 :(得分:1)

您可以找到正确的方法here

#include <stdio.h>

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

基本上这个原因已由sharptooth解释过,但是你会发现一些更多的细节和解释,当你进行这样的交换时背景会发生什么。希望有助于清除您的想法。

答案 6 :(得分:0)

int *t;
*t=*x;

t未指向能够取消引用的任何有效位置。

  

在为指针t赋值之前,必须进行初始化。

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