Pokimon
Указатель действительно не содержит информации о типе, но в C++ компилятор не позволит присвоить указателю не свой тип, потребуется явное преобразование. А вот в C позволит...
BlackRaven
На чём раньше писал?
В Pascal, например, указатели тоже есть.
Два основных плюса:
1) Динамическая память.
2) Скорость.
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 только потому, что она принимает указатель другого типа.
Другой вопрос, как эта информация хранится. Точно не знаю, но думаю что не вместе со значением указателя - адресом на ячейку памяти.
О. Федор
> Здесь указатель c не может быть передан в качестве аргумента в функцию f только
> потому, что она принимает указатель другого типа.
> Другой вопрос, как эта информация хранится. Точно не знаю, но думаю что не
> вместе со значением указателя - адресом на ячейку памяти.
тебя компилятор ограничивает от передачи не того указателя, так что это компилятор знает тип указателя, сама программа уже ничего не знает.
Voltt
Тема называется "Вопросы по C++", поэтому мы говорим о указателях в этом языке, а не в C.
Necrys
> тебя компилятор ограничивает от передачи не того указателя, так что это
> компилятор знает тип указателя, сама программа уже ничего не знает.
Ага.
Ты имеешь в виду возможность реинтерпретировать указатель?
Хорошо, а что такое реинтерпретация, как не способ принудительно заставить компилятор забыть информацию о действительном типе? Т.е. возможность реинтерпретации типа все же нисколько не отменяет того факта, что информация о типе все же есть. В какой форме - это другой вопрос.
Официально заявляю, Фёдор прав.
О. Федор
> Указатель содержит в себе следующую информацию: тип данных и адрес ячейки с
> данными
Не вводите в заблуждение...
> информация о типе все же есть. В какой форме - это другой вопрос.
Именно другой... сам указатель - только адрес.
Спс всем за развёрнутые ответы, в общем и целом понял что и для чего. Остальное дело практики
Voltt
> Именно другой... сам указатель - только адрес.
Нет, указатель имеет еще и тип.
Уточнил бы так: информация о типе - статическая, ее нельзя менять, можно только иначе интерпретировать, а адрес (значение указателя) - информация динамическая, ее во время выполнения программы можно менять.
Да не имеет он типа, посмотрел бы в ассемблер, тогда бы понял что к чему - а там гоняются туда сюда просто так адреса памяти, и я тебя уверяю, подставить туда можно любой адрес, другой вопрос, что то, что произойдёт дальше - скорей всего будет полная херня.
Voltt
Ты вообще в курсе, как например хранится информация о переменной k в следующем коде
struct BlaBla { const static int k = 11; };
?
В ячейке памяти с именем k?
Necrys
Как ты можешь проверить ассемблер код, который даже не компилируется? Проверка же типов - статическая.
а что, не приходилось вставки на асме писать? там всё весело работает и чуть не туда свернёшь, ясный пень, глючит. Но компилируется.
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 даже не существует; у нее нет адреса.
Necrys
Ты можешь на асме обойти стандарт языка? Ну и что? Какое это имеет отношение к языку?
Изнасиловать память можно не только с помощью асмы; существуют и другие, более цивильные способы.
Но какое это все имеет отношению к тезису, что указатель имеет статическую информацию о типе?