Войти
ФлеймФорумПрограммирование

Вопросы по C++ (3 стр)

Страницы: 1 2 3 4 59 Следующая »
#30
22:19, 17 дек. 2009

Pokimon
Указатель действительно не содержит информации о типе, но в C++ компилятор не позволит присвоить указателю не свой тип, потребуется явное преобразование. А вот в C позволит...

BlackRaven
На чём раньше писал?
В Pascal, например, указатели тоже есть.
Два основных плюса:
1) Динамическая память.
2) Скорость.


#31
22:32, 17 дек. 2009

Pokimon
> Указатель содержит только адрес. Только 4 байта(32 bit системы). И не содержит
> НИКАКОЙ информации о типе.

Разумеется содержит информацию о типа. Пожалуйста, вот пример

void f(long *a)
{}

int main()
{
  long *a = new long;
  int *c = new int;

  f(a);   //OK
  f(c);   //error C2664: 'f': Konvertierung des Parameters 1 von 'int *' in 'long *' nicht möglich
          //Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert 
          //einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. 
  delete a, c;
} 

Здесь указатель c не может быть передан в качестве аргумента в функцию f только потому, что она принимает указатель другого типа.
Другой вопрос, как эта информация хранится. Точно не знаю, но думаю что не вместе со значением указателя - адресом на ячейку памяти.

#32
22:34, 17 дек. 2009

О. Федор
> Здесь указатель c не может быть передан в качестве аргумента в функцию f только
> потому, что она принимает указатель другого типа.
> Другой вопрос, как эта информация хранится. Точно не знаю, но думаю что не
> вместе со значением указателя - адресом на ячейку памяти.
тебя компилятор ограничивает от передачи не того указателя, так что это компилятор знает тип указателя, сама программа уже ничего не знает.

#33
22:35, 17 дек. 2009

  Voltt

Тема называется "Вопросы по C++", поэтому мы говорим о указателях в этом языке, а не в C.

#34
22:40, 17 дек. 2009

Necrys
> тебя компилятор ограничивает от передачи не того указателя, так что это
> компилятор знает тип указателя, сама программа уже ничего не знает.

Ага.
Ты имеешь в виду возможность реинтерпретировать указатель?
Хорошо, а что такое реинтерпретация, как не способ принудительно заставить компилятор забыть информацию о действительном типе? Т.е. возможность реинтерпретации типа все же нисколько не отменяет того факта, что информация о типе все же есть. В какой форме - это другой вопрос.

#35
22:47, 17 дек. 2009

Официально заявляю, Фёдор прав.

#36
22:56, 17 дек. 2009

О. Федор
> Указатель содержит в себе следующую информацию: тип данных и адрес ячейки с
> данными
Не вводите в заблуждение...
> информация о типе все же есть. В какой форме - это другой вопрос.
Именно другой... сам указатель - только адрес.

#37
23:04, 17 дек. 2009

Спс всем за развёрнутые ответы, в общем и целом понял что и для чего. Остальное дело практики

#38
23:15, 17 дек. 2009

Voltt
> Именно другой... сам указатель - только адрес.

Нет, указатель имеет еще и тип.
Уточнил бы так: информация о типе - статическая, ее нельзя менять, можно только иначе интерпретировать, а адрес (значение указателя) - информация динамическая, ее во время выполнения программы можно менять.

#39
23:18, 17 дек. 2009

Да не имеет он типа, посмотрел бы в ассемблер, тогда бы понял что к чему - а там гоняются туда сюда просто так адреса памяти, и я тебя уверяю, подставить туда можно любой адрес, другой вопрос, что то, что произойдёт дальше - скорей всего будет полная херня.

#40
23:26, 17 дек. 2009

Voltt

Ты вообще в курсе, как например хранится информация о переменной k в следующем коде

struct BlaBla
{
  const static int k = 11;
};

?
В ячейке памяти с именем k?

#41
23:29, 17 дек. 2009

Necrys
Как ты можешь проверить ассемблер код, который даже не компилируется? Проверка же типов - статическая.

#42
23:36, 17 дек. 2009

а что, не приходилось вставки на асме писать? там всё весело работает и чуть не туда свернёшь, ясный пень, глючит. Но компилируется.

#43
23:36, 17 дек. 2009

Voltt
Я продолжу свой пример из поста 40.

struct BlaBla
{
  const static int k1 = 11;
  static int k2;

  void f()
  {
    int &r1 = k1;  //error C2440: 'Initialisierung': 'const int' kann nicht in 'int &' konvertiert werden
    int &r2 = k2;  //OK
  }
};

Отсюда ясно видно, что ячейки k1 даже не существует; у нее нет адреса.

#44
23:41, 17 дек. 2009

Necrys
Ты можешь на асме обойти стандарт языка? Ну и что? Какое это имеет отношение к языку?
Изнасиловать память можно не только с помощью асмы; существуют и другие, более цивильные способы.
Но какое это все имеет отношению к тезису, что указатель имеет статическую информацию о типе?

Страницы: 1 2 3 4 59 Следующая »
ФлеймФорумПрограммирование