2013-06-03 2 views
-2

Когда динамическое выделение буфера из символьного типа * и, если вы хотите, чтобы привести его к определенному типу, вы должны использовать:reinterpret_cast <int *> (символ *)

reinterpret_cast<int *>(char *) 

или:

static_cast<int *>(static_cast<void *>(char *)) 

и почему?

+6

Любой хороший вводный C++ книга объяснить. Первый - это объявление указателя, второе - указатель. «*» Означает разные вещи в двух контекстах. –

+0

Конечно, я это знаю. Может быть, вы не поняли мой вопрос или мой вопрос плохо построен. – Zingam

+0

-1: неспособность сделать фундаментальные исследования. – milleniumbug

ответ

5

Это *pk = new int(2); должно быть pk вместо *pk

После того как вы объявили указатель int * pointer, все ссылки на point ссылаться на адрес и все ссылки на *pointer относятся к тому, что содержащиеся по адресу. По умолчанию указатели не указывают на правильные ячейки памяти, вам необходимо назначить действительный адрес или позвонить по адресу new. Вот почему, когда вы пишете pk = &k, ошибок сегментации нет - потому что pk теперь содержит адрес k, который указывает на допустимую ячейку памяти.

Синтаксис указателей может быть немного запутанным, главным образом потому, что * может иметь несколько значений, в зависимости от того, как вы его используете. Вот краткое объяснение:

  • В декларациях, * означает, что вы объявляете указатель (т.е. int * pk).
  • Между численными типами данных * является символом для умножения (то есть 4 * num).
  • Написано рядом с переменной, оно возвращает значение по адресу, содержащему указатель (т.е. *myPointer или (*mypointer)).

С new возвращает адрес, вы назначаете адрес для pk вместо значения, указываемого pk.

Если вы хотите инициализировать указатель, объявите его оператором new. Например:

int * pk = new int; 

Но нет функции времени компиляции, которая объявляет автономный указатель и значение. Самое близкое, что вы придете к этому, - объявить отдельную переменную, как вы это сделали, и инициализировать указатель с адресом этой переменной. Как это:

int num = 43; 
int * p = &num; 
+0

Точно. pk - указатель на int; new int (...) возвращает указатель на int, * pk - int. – mah

+0

Извините! Ты прав. Это ошибка, а не часть вопроса. – Zingam

0
int* pk = nullptr; 

Здесь вы объявляете, что рк является указателем на int.

*pk = new int(2); 

Тип *pk является int и тип возвращаемого new int(2) является int*.

0

pk - указатель, а *pk - значение, на которое оно указывает.

Так изменить свой код,

int* pk = new int; 

pk = reinterpret_cast<int*>(2); 

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

+1

'* pk' - это * объект *, на который указывает' pk', а не только значение этого объекта. –

+0

Когда я разыскиваю * pk, я получаю ошибку seg в этом случае; – Zingam

+0

@ Zingam Ну, конечно, вы назначаете 'x' для адреса' 0x02'. Вы не знаете, что находится по этому адресу. Это то, что вы получаете за использование 'reinterpret_cast', это неявно опасно. – 0x499602D2

0

Как инициализировать указатель со значением?

У вас нет. Это пункт с указателем. Вы не инициализируете его со значением. Вы инициализируете его с помощью переменной адрес.

Давайте проанализируем его шаг за шагом:

int* pk; 

У вас есть указатель, и это неинициализированное, так что теперь это хуже, чем бесполезно.

int* pk = nullptr; 

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

if(pk) 
{ 
    //do operations on pointed value *pk 
} 
else 
{ 
    //Houston, we have a problem 
} 

В настоящем время, эти операции не имеют никакого смысла

*pk = 2; //you haven't pointed with pk to anything 
*pk = reinterpret_cast<int*>(2); //????? *pk is int, and right-hand side is int*. What do you expect to do with it? 

Этот код работает

int k; 
pk = &k; 
*pk = 3; 

потому, что вы на самом деле указали рк на что-то значимое.

1
  • Не могли бы вы объяснить мне, что здесь происходит?

используется инициализированы переменные: http://en.wikipedia.org/wiki/Uninitialized_variable

int* pk; // declare variable `pk` of type `int*` but do not initialize it 
*pk = 2; // use unitialized variable. `*` is dereference operator. Seg fault 
int k; // declare variable `k` of type `int`, not initialized 
pk = &k; // initialize variable `pk` with address of variable `k` 
*pk = 3; // use initialized variable. Ok now 

разыменовывают Оператор: http://en.wikipedia.org/wiki/Dereference_operator

Смежные вопросы