2013-05-30 4 views
-5

Я родом из более фона Java, однако я встречал такие вещи, как это:Почему мы создаем объекты-указатели?

SDL_Surface *dot = NULL; 

Почему мы ставим звездочку перед объектом?

Почему нельзя это сделать:

SDL_Surface dot = NULL; 

В чем разница между ними?

Я знаю, что это указатель, но что именно происходит?

+11

Указатели не простая тема, которая может быть объяснена в SO ответ. Я настоятельно советую вам получить хорошую книгу о C++. –

+0

Я не знаю, что такое SDL_Surface - это структура, класс? Указатель позволяет создавать динамические объекты в куче. Звездочка обозначает указатель на объект. Я бы посоветовал вам ознакомиться с некоторыми учебниками основ c/C++. Если вам нужно начать с большого количества кода с указателем, и у вас есть фон Java, у вас будут проблемы с другими. – OldProgrammer

+0

Люди должны останавливать голосование только из-за сложности вопроса. –

ответ

2

Почему это [мы] помещаем звездочку перед объектом?

Мы используем звездочку * как часть этого типа, чтобы объявить указатель. Без него компилятор не знал бы, что это указатель, он просто интерпретирует его как обычный объект.

int x; // an integer 
int *x; // a pointer to an integer 

Java имеет null но NULL в C++ препроцессор макрос, который расширяется до 0. Если указатели установлены на 0, это обычно означает, что они не были инициализированы значением.

int *x = NULL; // same as int *x = 0 

В чем разница между ними?

Я думаю, this отвечает на этот вопрос.

+0

Так что происходит, когда я делаю cout << точка; ? –

+0

@TeraByte Вы получите ошибку компилятора, потому что '*' не является указателем, это оператор, который при использовании в определенных контекстах может иметь разные коннотации. Это не универсальный символ для указателя. Как насчет выполнения 'int y, * x = & y; cout << x; '. Это напечатает адрес 'y'. – 0x499602D2

+0

поэтому, когда я делаю SDL_Surface * dot = NULL, я создаю указатель на пустой адрес? –

1

В принципе, указатель является ссылкой на адрес. Если у вас есть что-то вроде:

int temp = 1; 
int *p; // or int* p or int * p 
p = &temp; 

Вы не присваивая значение температуры р, но вы делаете ссылку на адрес в стеке. Разница ясна: это где, а не сколько.

И наоборот, вы можете сделать это:

int temp2 = 0; 
temp2 = *p; //temp2 is now 1 

Для дальнейшего чтения по этой теме, обратитесь к this.

+1

'указатель - это ссылка на адрес'. Uhm, нет, это не так, указатель - это указатель. –

+1

Возможно, это мой английский, но указатель указывает на адрес. И как круговая логика помогает при объяснении чего-то? – hellerve

0

Предполагая SDL_Surface класс ...

SDL_Surface *dot = NULL;

Это означает dot указатель на объекты SDL_Surface и инициализируется NULL. Значит, это не указывает на какой-либо объект. Указатели - это переменные, которые содержат адрес другой переменной. Чтобы сделать dot, укажите объект SDL_Surface, вы должны выделить объект и присвоить адрес dot. В C++ вы можете сделать это с помощью оператора new.

SDL_Surface *dot = new SDL_Surface

Это создаст объект в куче. Таким образом, вы должны вручную освободить его с помощью delete operateor

delete dot