Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
Начал изучать язык С. Озадачился таким вопросом, просто для понимания. Зачем при описании указателя нужен тип? Адрес это же всегда целое число одного и того же размера не зависимо от того, что по нему хранится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 17:12 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
А что потом можно сделать с указателем на неизвестно что? Тип нужен, чтобы иметь возможность доступа к данным, на которые этот указатель ссылается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 17:18 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NET, в принципе да. Можно все указатели декларировать как void * и софт будет норм. работать. Только при использовании каждый раз делать кастинг вручную просто... на основе самих знаний о том на что указатель ДОЛЖЕН указывать. Но есть вкусные фичи касающиеся связи массивов и указателей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 17:52 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NET, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. какой код генерить бедному компилятору? насколько подвинуть указатель p2 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 18:05 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETЗачем при описании указателя нужен тип? В дополнение к сказаному выше будет нормально работать адресная арифметика. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 18:08 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETНачал изучать язык С. Озадачился таким вопросом, просто для понимания. Зачем при описании указателя нужен тип? Чтобы знать тип данных той переменной, на которую указатель указывает, и в соответствии с этим правильно обрабатывать данные этой переменной. Указатель как чисто адрес в языках С/С++ представлен типом данных Код: plaintext 1. но разименовать указатель такого типа нельзя -- нужно сначала привести (преобразовать) его к типизированному указателю. .NETАдрес это же всегда целое число одного и того же размера не зависимо от того, что по нему хранится. Это не так. Т.е. это утверждение ложно. Адрес (указатель в С) -- это не число, и указатель может быть разного размера . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2014, 20:53 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETНачал изучать язык С. Озадачился таким вопросом, просто для понимания. Зачем при описании указателя нужен тип? Адрес это же всегда целое число одного и того же размера не зависимо от того, что по нему хранится. Указатель это переменная содержащая адрес другой переменной. Указатель это набор 0 и 1, которые ни в коем случае не понимаются как целое число. Вообще говоря, указатели являются крайне важным механизмом языка Си. Вам привели пример из адресной арифметики, опишу его немного подробнее. Суть добавления числа sh к указателю (T*)p в том, что число sh масштабируется размером того типа данных, на который указывает p, в нашем случае, масштабируется sizeof(T). Например: Код: plaintext 1. 2. 3. в данном случае, sizeof(char)=1Байт(чаще всего),потому new_p будет указывать на участок памяти размером в 1 Байт, расположенный через 10 Байт после p. А вот в таком участке кода Код: plaintext 1. 2. 3. в данном случае, sizeof(int)=4Байт(чаще всего),потому new_p будет указывать на участок памяти размером в 4 Байт(в том смысле, что при чтение по указателю *p будет прочитано 4 Байта), расположенный через 40 Байт после p. Это вам объяснял Изопропил , но более сжато. И обратите внимание на MasterZivЧтобы знать тип данных той переменной, на которую указатель указывает, и в соответствии с этим правильно обрабатывать данные этой переменной. Вы пытаетесь прочитать значение по указателю *p, если мы не будем знать на какой тип указывает p, то как система узнает сколько байт ей прочитать ? Никак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 01:56 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
Да, да всем спасибо. Я как-то подзабыл, что тип - это не только данные, но и методы работы с ними. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 15:57 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
MasterZiv указатель может быть разного размера . Каким образом? При получении указателя, как результата выполнения удаленного вызова? В рамках одной операционной системы все указатели имеют один размер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 16:02 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NET... В рамках одной операционной системы все указатели имеют один размер? Если ты об адресах памяти - то нет. В рамках одной модели адресации - да. Пример: выполнение приложения x32 в x64 среде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 16:23 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
ZeroMQ.NET... В рамках одной операционной системы все указатели имеют один размер? Если ты об адресах памяти - то нет. В рамках одной модели адресации - да. Пример: выполнение приложения x32 в x64 среде. Я имею ввиду в рамках одного процесса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 16:46 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETZeroMQпропущено... Если ты об адресах памяти - то нет. В рамках одной модели адресации - да. Пример: выполнение приложения x32 в x64 среде. Я имею ввиду в рамках одного процесса. То есть можно ли создать в программе два указателя с разным размером. Чтобы sizeof(type1*) == sizeof(type2*) было ложно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 16:54 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETMasterZiv указатель может быть разного размера . Каким образом? При получении указателя, как результата выполнения удаленного вызова? Я не знаю, каким образом. Я знаю, что стандарт тебе не даёт гарантии, что указатель имеет один размер. .NETВ рамках одной операционной системы все указатели имеют один размер? Нет. Вспомни/выучи программирование в OS DOS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 16:59 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NET.NETпропущено... Я имею ввиду в рамках одного процесса. То есть можно ли создать в программе два указателя с разным размером. Чтобы sizeof(type1*) == sizeof(type2*) было ложно. Да, можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 17:01 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETТо есть можно ли создать в программе два указателя с разным размером. Чтобы sizeof(type1*) == sizeof(type2*) было ложно. В стандартном С++ не помню, но у Борландов можно создать указатель на метод класса, который вдвое больше обычного. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 17:02 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov.NETТо есть можно ли создать в программе два указателя с разным размером. Чтобы sizeof(type1*) == sizeof(type2*) было ложно. В стандартном С++ не помню, но у Борландов можно создать указатель на метод класса, который вдвое больше обычного. Это всё -- стандартные возможности, они есть в любом компиляторе. Но проблема в том, что "указатель на метод класса" или "указатель на член класса" и обычный указатель -- это разные вещи. То, что у них в названии есть общее слово "указатель" -- это в общем просто случайность. Они никак друг с другом не связаны. Они похожи, но по сути разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 18:28 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETТо есть можно ли создать в программе два указателя с разным размером. Чтобы sizeof(type1*) == sizeof(type2*) было ложно.Да. Нет. Да, это возможно. Нет, ни сегодня, ни завтра, ни через неделю ты этого в реальности не увидишь. Это связано с тем, что в разных программно-аппаратных комплексах по разному организована работа с памятью. В тех случаях когда CPU может обращаться к памяти по разному появляется возможность указателей физически разных типов. Чаще всего это различия на уровне "абсолютный" или "относительный" адрес. Бывают еще и различия на уровне разных типов памяти или прямых обращений к различным внешним модулям (hardware модулям), но они обычно тоже сводятся к абсолютно-относительной модели. Самый широко известный пример - "реальный режим" в процессорах семейства Intel x86 (от 8086 до 80386). В нынешних десктопах и мобильных системах подобных проблем стараются избегать и делать работу с памятью унифицированной. Все современные CPU умеют делать виртуализацию памяти и прячут все технические сложности сопряжения разных типов памяти и вариации работы с ней под одним общим принципом обращений. Поэтому чтобы реально увидеть разные размеры указателей тебе придется искать какую-нибудь IBM PC XT и запускать там код типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Большинство сегодняшних компиляторов вообще откажутся это собирать и скажут что в строке "char far *p2;" синтаксическая ошибка. Но древности типа TurboC или QuickC скушают это и выдадут две разные цифры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 19:28 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETТо есть можно ли создать в программе два указателя с разным размером. Чтобы sizeof(type1*) == sizeof(type2*) было ложно. Да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2014, 20:07 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev.NETТо есть можно ли создать в программе два указателя с разным размером. Чтобы sizeof(type1*) == sizeof(type2*) было ложно. Да Приведите конкретный пример пожалуйста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 09:32 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryLeonid Kudryavtsevпропущено... Да Приведите конкретный пример пожалуйста Выше по тексту Белый Сова пишет. Для олд-скульных компилляторов и бородатых операционок. Видел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 09:56 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
Вообще синтаксис указателей довольно путанный. При объявлении *d значит - адрес, а при манипуляции *d это то, что хранится по адресу *d. Например Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Функция принимает два адреса, но манипуляции проводит не с адресами, а со значениями. Кто бы мог подумать! Можно, конечно, попытаться убедить себя, что * относится не к имени переменной, а к имени типа, но зачем тогда было разрешать при объявлении переменных такой синтаксис Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 10:19 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
maytonSashaMercuryпропущено... Приведите конкретный пример пожалуйста Выше по тексту Белый Сова пишет. Для олд-скульных компилляторов и бородатых операционок. Видел? Видел, но мне показалось, что это скорее undefined behavior, чем defined implementation behavior Также, видел выше, Илья отсылал к стандарту, но всё-же захотелось увидеть конкретный пример. Вообще, про стандарт и размеры, я поднимал вопросы ранее. Даёт ли вообще стандарт гарантии размера? Мне показалось что присутствует только оценка снизу. Посмотрю точно, и напишу. Я рассуждаю так. У нас есть определённая адресация реализованная для заданной ОС, потому я точно знаю, сколько байт занимает адрес(т.е. мы имеем константу для размера адреса памяти). Потому указатель, при прогнозируемом нормальном поведении, должен занимать константный объём памяти. Хотя эти рассуждения пустяк, ибо стандарт говорит обратное. Или стандарт просто не даёт гарантии ? Так стандарт и не должен давать гарантии. Если есть закон запрещающий воровать, то это не значит что люди не будут воровать. Тонкие моменты, хотя казалось бы что ответ очевиден ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 11:16 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NETВообще синтаксис указателей довольно путанный. При объявлении *d значит - адрес, а при манипуляции *d это то, что хранится по адресу *d. Например Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Функция принимает два адреса, но манипуляции проводит не с адресами, а со значениями. Кто бы мог подумать! Можно, конечно, попытаться убедить себя, что * относится не к имени переменной, а к имени типа, но зачем тогда было разрешать при объявлении переменных такой синтаксис Код: plaintext 1. * можно расположить где угодно. Ответ на ваш последний вопрос: для того чтобы можно было в одной строке объявить несколько указателей. Код: plaintext 1. Хотя вот вам ещё пример. Код: plaintext 1. 2. в чём разница ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 11:20 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
.NET Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 1.Что вам не нравится в этой функции с точки зрения функционала ? 2. В каком случае она сработает некорректно ? кстати, можно короче Код: plaintext 1. PS Совсем скоро вы полюбите указатели :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 11:28 |
|
||
|
Зачем компилятору языка С знать на какой тип указывает указатель.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЯ рассуждаю так. У нас есть определённая адресация реализованная для заданной ОС, потому я точно знаю, сколько байт занимает адрес(т.е. мы имеем константу для размера адреса памяти).Неправильно вы рассуждаете. В x86 - сегментная память, поэтому существуют NEAR16, NEAR32, FAR16 и FAR32. NEAR32 и FAR16 - одинаковы по размеру, но различаются по интерпретации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2014, 11:40 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38805979&tid=2019233]: |
0ms |
get settings: |
13ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
| others: | 301ms |
| total: | 466ms |

| 0 / 0 |
