Обязательно ли инициализировать указатели в C++?
Обязательно ли инициализировать t
в следующем коде, прежде чем присваивать значение t
? Код правильный?
void swap(int *x, int *y)
{
int *t;
*t = *x;
*x = *y;
*y = *t;
}
7 ответов
Вам не нужен указатель для начала:
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!
следующий раздел кода правильный?
Nopes! Ваш код вызывает неопределенное поведение, потому что вы пытаетесь разыменовать дикий указатель.
int *t;
*t=*x; // bad
Попробуй это скорее
int t; // a pointer is not needed here
t=*x;
или это
int *t = x; // initialize the pointer
Этот код содержит неопределенное поведение:
int *t;
*t=*x; // where will the value be copied?
Кроме того, это не имеет смысла - вам нужна временная переменная для хранения значения, а не указатель.
int t; // not a pointer
t=*x;
*x=*y;
*y=t;
Если вы просто хотите, чтобы указатель указывал на уже инициализированные данные, вам не нужно его инициализировать. То, как вы это делаете, тем не менее, да, вы хотите использовать одну из функций malloc для выделения достаточного пространства кучи для целого числа.
Правильный и эффективный способ сделать обмен в C/C++
void swap(int *x, int *y) {
int *t = x;
x = y;
y = t;
}
Вы можете найти правильный способ сделать это здесь
#include <stdio.h>
void swap(int *i, int *j)
{
int t;
t = *i;
*i = *j;
*j = t;
}
По сути, причина была объяснена вам с помощью острого зуба, но там вы найдете более подробную информацию и объяснения о том, что происходит в фоновом режиме, когда вы делаете такой обмен. Надеюсь, это поможет прояснить ваши идеи.
Это правильно для указателя.
Только ссылки должны быть инициализированы после объявления (или в конструкторе для членов экземпляра).
РЕДАКТИРОВАТЬ: но вы получили ошибки в вашем коде, вы не должны разыменовывать ваши параметры (т.е. int *ptr = otherPtr;
хорошо, не int *ptr = *otherPtr;
)
int *t;
*t=*x;
t
не указывает на какое-либо действительное местоположение, чтобы иметь возможность разыменования.
Обязательно ли инициализировать, прежде чем присваивать значение указателю t.
Да, инициализация / назначение для указания на правильное местоположение в памяти. Иначе, куда бы это указывало. Это может указывать на мусор и приводить к неопределенному поведению при разыменовании.