Обязательно ли инициализировать указатели в C ++? - PullRequest
5 голосов
/ 23 марта 2011

Обязательно ли инициализировать t в следующем коде, прежде чем присваивать значение t? Код правильный?

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

Ответы [ 7 ]

9 голосов
/ 23 марта 2011

Вам не нужен указатель для начала:

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!
8 голосов
/ 23 марта 2011

правильный ли следующий раздел кода?

Nopes! Ваш код вызывает неопределенное поведение, потому что вы пытаетесь разыменовать дикий указатель.

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

Попробуйте это скорее

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

или это

int *t = x; // initialize the pointer

5 голосов
/ 23 марта 2011

Этот код содержит неопределенное поведение:

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

Кроме того, это не имеет смысла - вам нужна временная переменная для хранения значения, а не указатель.

int t; // not a pointer
t=*x;
*x=*y;
*y=t;
1 голос
/ 23 марта 2011

Вы можете найти правильный способ сделать это здесь

#include <stdio.h>

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

В основном причина была объяснена вам с помощью острого зуба, но там вы найдете более подробную информацию и объяснения о том, чтопроисходит в фоновом режиме, когда вы делаете такой обмен.Надеюсь, это поможет прояснить ваши идеи.

1 голос
/ 23 марта 2011

Если вы просто хотите, чтобы указатель указывал на уже инициализированные данные, вам не нужно его инициализировать. Однако, как вы это делаете, да, вы хотите использовать одну из функций malloc для выделения достаточного пространства кучи для целого числа.

Правильный и эффективный способ подкачки в C / C ++ -

void swap(int *x, int *y) {
    int *t = x;
    x = y;
    y = t;
}
1 голос
/ 23 марта 2011

Это правильно для указателя.

Только ссылки должны быть инициализированы после объявления (или в конструкторе для членов экземпляра).

РЕДАКТИРОВАТЬ: но вы получили ошибки в своем коде, вы не должны разыменовывать свои параметры (т.е. int *ptr = otherPtr; в порядке, а не int *ptr = *otherPtr;)

0 голосов
/ 23 марта 2011
int *t;
*t=*x;

t не указывает ни на одно действительное местоположение, чтобы иметь возможность разыменования.

обязательно ли инициализировать, прежде чем присваивать значение указателю t.

Да, инициализация / назначение для указания на правильное местоположение в памяти. Иначе, куда бы это указывало. Это может указывать на мусор и приводить к неопределенному поведению к разыменованию .

...