некоторые недоразумения по поводу указателя на объект - PullRequest
2 голосов
/ 15 апреля 2020

Вопрос 1: что такое значение указателя?

Значение типа указателя, который является указателем на или после конца объекта, представляет адрес первого байта в памяти ([intro .memory]) занятые объектом 54 или первым байтом в памяти после окончания памяти, занятой объектом, соответственно.

Означает ли это, что значение указателя является адресом объекта?

Вопрос 2: Как понять, что ** значение указателя не изменилось **?

[expr.stati c .cast] / 13

В противном случае, если исходное значение указателя указывает на объект a, и существует объект b типа T (игнорирующий квалификацию cv), который взаимозаменяем с указателем с a, результатом является указатель на b. В противном случае значение указателя не изменяется при преобразовании.

Рассмотрим приведенный ниже пример:

#include <iostream>
int main(){
   int a = 0;
   void* tmp = &a;
   char* obj = static_cast<char*>(tmp);
}

Согласно приведенной выше цитате мы знаем, что исходные значения указателя tmp указывают на a, а пункт назначения Значения указателя указывают на объект типа char, поскольку они не являются взаимозаменяемыми указателями, поэтому предложение значение указателя не изменяется при преобразовании сработало. Это означает, что obj теперь является точкой указателя на Объект типа char и Dynami c Тип объекта int, если я неправильно понимаю о pointer value is unchanged, что означает это предложение?

Вопрос 3: Как понять, что the result is a pointer to b.

#include <iostream>
struct Data{
  int c;
}
int main(){
  Data d;
  void* tmp2 = &d;
  int* ptr = static_cast<int*>(tmp2);
}

мы знаем, что исходные значения указателя tmp2 указывают на d, поэтому исходное значение указателя указывает на на объект типа Data, а целевой указатель указывает на объект типа int, и эти два объекта являются взаимозаменяемыми по указателю, поэтому предложение the result is a pointer to b сработало. Это означает, что теперь ptr указатель на Объект типа int и Dynami c Тип объекта также int?

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Значение типа указателя, который является указателем на или после конца объекта, представляет адрес первого байта в памяти ([intro.memory]), занятого объектом или первым байт в памяти после окончания памяти, занимаемой объектом, соответственно.

Означает ли это, что значение указателя является адресом объекта?

Эта структура предложения "A или B означают X или Y соответственно," читается как "условие A подразумевает X, или, альтернативно, условие B подразумевает Y."

Таким образом, предложение означает оба

Значение типа указателя, который является указателем на объект, представляет адрес первого байта в памяти ([intro.memory]), занятого объект ...

и

Значение типа указателя, который является указателем после конца объекта, представляет адрес первый байт в памяти после окончания памяти, занятой объектом.

соответственно позволили авторам дублировать преамбулу, которую я должен был повторить при ее расширении следующим образом.

И, после всего этого, ваш смысл был Это не совсем правильно даже для первого случая.

Это означает, что указатель, , если , это указатель на объект, представляет адрес первого байта объекта в памяти. Он ничего не говорит о значении любого указателя, если только он не является указателем на ... объект .

Это не означает, что каждое значение указателя является адресом объект, потому что указатели могут быть неинициализированы, или установлены в nullptr, или установлены в результате необработанного выделения, которое еще не было превращено в объект с размещением new. Указатель по-прежнему может содержать адрес объекта, который вы просто delete -d через указатель, а также.

Я знаю, что стандарт не очень легко читать, особенно если вы не привыкли этот стиль (или для Engli sh) - но это означает, что вам нужно приложить некоторые усилия, чтобы прочитать его внимательно .

0 голосов
/ 15 апреля 2020

Означает ли это, что значение указателя является адресом объекта?

В разговорной речи да, это было бы совершенно верно. Точнее, это означает, что значение указателя является адресом. Значением указателя объекта может быть адрес объекта, но оно также может быть недопустимым значением указателя, нулевым или неопределенным.

Означает ли это, что объект obj теперь является точкой указателя на объект типа char

Да.

Если я неправильно понимаю значение указателя, оно остается неизменным, что означает это предложение?

Просто адрес тот же. obj является указателем на char и указывает на тот же адрес, где хранится объект int. Но obj не является указателем на a.


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

Просто наличие указателя на тип T с тем же значением (то есть указанным адресом), как у другого объекта, само по себе не означает что он хорошо определен для доступа через указатель. Даже если существует объект такого типа по адресу (в этом случае вы можете получить указатель на объект, std::launder используя указатель). В вашем примере, однако, допустимо косвенное использование obj, поскольку указатели на узкие типы символов являются специальными.

Короче говоря, указатель всегда указывает на адрес. Он может указывать или не указывать на объект по этому адресу. Может быть несколько объектов с одним и тем же адресом (только в тех случаях, когда используются подчиненные объекты). Не все адреса всегда содержат объект.

...