powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Зачем компилятору языка С знать на какой тип указывает указатель.
56 сообщений из 56, показаны все 3 страниц
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38803867
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начал изучать язык С. Озадачился таким вопросом, просто для понимания.
Зачем при описании указателя нужен тип?
Адрес это же всегда целое число одного и того же размера не зависимо от того, что по нему хранится.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38803875
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что потом можно сделать с указателем на неизвестно что?
Тип нужен, чтобы иметь возможность доступа к данным, на которые этот указатель ссылается.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38803930
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NET, в принципе да. Можно все указатели декларировать как void * и софт
будет норм. работать. Только при использовании каждый раз делать кастинг
вручную просто... на основе самих знаний о том на что указатель ДОЛЖЕН
указывать.

Но есть вкусные фичи касающиеся связи массивов и указателей.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38803949
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NET,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
double * p1;
int * p2;
...
*p1=1;
*p2=1;

...

p2++



какой код генерить бедному компилятору?
насколько подвинуть указатель p2 ?
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38803955
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETЗачем при описании указателя нужен тип?
В дополнение к сказаному выше будет нормально работать адресная арифметика.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38804107
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETНачал изучать язык С. Озадачился таким вопросом, просто для понимания.
Зачем при описании указателя нужен тип?

Чтобы знать тип данных той переменной, на которую указатель указывает, и в соответствии с этим правильно обрабатывать данные этой переменной.

Указатель как чисто адрес в языках С/С++ представлен типом данных
Код: plaintext
1.
void*



но разименовать указатель такого типа нельзя -- нужно сначала привести (преобразовать) его к типизированному указателю.

.NETАдрес это же всегда целое число одного и того же размера не зависимо от того, что по нему хранится.


Это не так. Т.е. это утверждение ложно.
Адрес (указатель в С) -- это не число, и указатель может быть разного размера .
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38804186
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETНачал изучать язык С. Озадачился таким вопросом, просто для понимания.
Зачем при описании указателя нужен тип?
Адрес это же всегда целое число одного и того же размера не зависимо от того, что по нему хранится.
Указатель это переменная содержащая адрес другой переменной. Указатель это набор 0 и 1, которые ни в коем случае не понимаются как целое число.


Вообще говоря, указатели являются крайне важным механизмом языка Си. Вам привели пример из адресной арифметики, опишу его немного подробнее. Суть добавления числа sh к указателю (T*)p в том, что число sh масштабируется размером того типа данных, на который указывает p, в нашем случае, масштабируется sizeof(T).
Например:
Код: plaintext
1.
2.
3.
char *p;
.....
char* new_p=p+10;


в данном случае, sizeof(char)=1Байт(чаще всего),потому new_p будет указывать на участок памяти размером в 1 Байт, расположенный через 10 Байт после p.
А вот в таком участке кода
Код: plaintext
1.
2.
3.
int *p;
.....
int* new_p=p+10;


в данном случае, sizeof(int)=4Байт(чаще всего),потому new_p будет указывать на участок памяти размером в 4 Байт(в том смысле, что при чтение по указателю *p будет прочитано 4 Байта), расположенный через 40 Байт после p.


Это вам объяснял Изопропил , но более сжато.

И обратите внимание на

MasterZivЧтобы знать тип данных той переменной, на которую указатель указывает, и в соответствии с этим правильно обрабатывать данные этой переменной.

Вы пытаетесь прочитать значение по указателю *p, если мы не будем знать на какой тип указывает p, то как система узнает сколько байт ей прочитать ? Никак.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805101
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, да всем спасибо.
Я как-то подзабыл, что тип - это не только данные, но и методы работы с ними.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805111
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv указатель может быть разного размера .

Каким образом?
При получении указателя, как результата выполнения удаленного вызова?

В рамках одной операционной системы все указатели имеют один размер?
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805143
ZeroMQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NET...
В рамках одной операционной системы все указатели имеют один размер?
Если ты об адресах памяти - то нет.
В рамках одной модели адресации - да. Пример: выполнение приложения x32 в x64 среде.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805193
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeroMQ.NET...
В рамках одной операционной системы все указатели имеют один размер?
Если ты об адресах памяти - то нет.
В рамках одной модели адресации - да. Пример: выполнение приложения x32 в x64 среде.

Я имею ввиду в рамках одного процесса.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805219
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETZeroMQпропущено...

Если ты об адресах памяти - то нет.
В рамках одной модели адресации - да. Пример: выполнение приложения x32 в x64 среде.

Я имею ввиду в рамках одного процесса.
То есть можно ли создать в программе два указателя с разным размером.
Чтобы sizeof(type1*) == sizeof(type2*) было ложно.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805226
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETMasterZiv указатель может быть разного размера .

Каким образом?
При получении указателя, как результата выполнения удаленного вызова?


Я не знаю, каким образом. Я знаю, что стандарт тебе не даёт гарантии, что указатель
имеет один размер.

.NETВ рамках одной операционной системы все указатели имеют один размер?

Нет. Вспомни/выучи программирование в OS DOS.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805227
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NET.NETпропущено...

Я имею ввиду в рамках одного процесса.
То есть можно ли создать в программе два указателя с разным размером.
Чтобы sizeof(type1*) == sizeof(type2*) было ложно.

Да, можно.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805229
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETТо есть можно ли создать в программе два указателя с разным размером.
Чтобы sizeof(type1*) == sizeof(type2*) было ложно.
В стандартном С++ не помню, но у Борландов можно создать указатель на метод класса,
который вдвое больше обычного.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805370
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov.NETТо есть можно ли создать в программе два указателя с разным размером.
Чтобы sizeof(type1*) == sizeof(type2*) было ложно.
В стандартном С++ не помню, но у Борландов можно создать указатель на метод класса,
который вдвое больше обычного.


Это всё -- стандартные возможности, они есть в любом компиляторе.

Но проблема в том, что "указатель на метод класса" или "указатель на член класса" и обычный указатель -- это разные вещи.
То, что у них в названии есть общее слово "указатель" -- это в общем просто случайность. Они никак друг с другом не связаны.
Они похожи, но по сути разные.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805439
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.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.
#include <stdio.h>

char *p1;
char far *p2;

int main() {
	printf("%d %d\n", sizeof(p1), sizeof(p2));
	return 0;
}

Большинство сегодняшних компиляторов вообще откажутся это собирать и скажут что в строке "char far *p2;" синтаксическая ошибка. Но древности типа TurboC или QuickC скушают это и выдадут две разные цифры.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805467
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETТо есть можно ли создать в программе два указателя с разным размером.
Чтобы sizeof(type1*) == sizeof(type2*) было ложно.
Да
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805753
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev.NETТо есть можно ли создать в программе два указателя с разным размером.
Чтобы sizeof(type1*) == sizeof(type2*) было ложно.
Да

Приведите конкретный пример пожалуйста
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805791
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryLeonid Kudryavtsevпропущено...

Да

Приведите конкретный пример пожалуйста
Выше по тексту Белый Сова пишет. Для олд-скульных компилляторов и бородатых операционок. Видел?
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805836
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще синтаксис указателей довольно путанный.
При объявлении *d значит - адрес, а при манипуляции *d это то, что хранится по адресу *d.

Например

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void swap(int *a, int *b)
{
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;

	return;
}



Функция принимает два адреса, но манипуляции проводит не с адресами, а со значениями.
Кто бы мог подумать!

Можно, конечно, попытаться убедить себя, что * относится не к имени переменной, а к имени типа,
но зачем тогда было разрешать при объявлении переменных такой синтаксис

Код: plaintext
1.
int a, *b
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805941
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryпропущено...


Приведите конкретный пример пожалуйста
Выше по тексту Белый Сова пишет. Для олд-скульных компилляторов и бородатых операционок. Видел?

Видел, но мне показалось, что это скорее undefined behavior, чем defined implementation behavior
Также, видел выше, Илья отсылал к стандарту, но всё-же захотелось увидеть конкретный пример.
Вообще, про стандарт и размеры, я поднимал вопросы ранее. Даёт ли вообще стандарт гарантии размера? Мне показалось что присутствует только оценка снизу. Посмотрю точно, и напишу.

Я рассуждаю так. У нас есть определённая адресация реализованная для заданной ОС, потому я точно знаю, сколько байт занимает адрес(т.е. мы имеем константу для размера адреса памяти). Потому указатель, при прогнозируемом нормальном поведении, должен занимать константный объём памяти. Хотя эти рассуждения пустяк, ибо стандарт говорит обратное. Или стандарт просто не даёт гарантии ? Так стандарт и не должен давать гарантии. Если есть закон запрещающий воровать, то это не значит что люди не будут воровать. Тонкие моменты, хотя казалось бы что ответ очевиден
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805948
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETВообще синтаксис указателей довольно путанный.
При объявлении *d значит - адрес, а при манипуляции *d это то, что хранится по адресу *d.

Например

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void swap(int *a, int *b)
{
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;

	return;
}



Функция принимает два адреса, но манипуляции проводит не с адресами, а со значениями.
Кто бы мог подумать!

Можно, конечно, попытаться убедить себя, что * относится не к имени переменной, а к имени типа,
но зачем тогда было разрешать при объявлении переменных такой синтаксис

Код: plaintext
1.
int a, *b



* можно расположить где угодно. Ответ на ваш последний вопрос: для того чтобы можно было в одной строке объявить несколько указателей.
Код: plaintext
1.
int *a,*b;



Хотя вот вам ещё пример.
Код: plaintext
1.
2.
int* a[10];
int (*b)[10];



в чём разница ?
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805958
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NET
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void swap(int *a, int *b)
{
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;

	return;
}




1.Что вам не нравится в этой функции с точки зрения функционала ?
2. В каком случае она сработает некорректно ?

кстати, можно короче

Код: plaintext
1.
*a ^= *b^=*a ^= *b;



PS
Совсем скоро вы полюбите указатели :)
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38805979
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ рассуждаю так. У нас есть определённая адресация реализованная для заданной ОС, потому я точно знаю, сколько байт занимает адрес(т.е. мы имеем константу для размера адреса памяти).Неправильно вы рассуждаете.
В x86 - сегментная память, поэтому существуют NEAR16, NEAR32, FAR16 и FAR32. NEAR32 и FAR16 - одинаковы по размеру, но различаются по интерпретации.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806002
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ рассуждаю так. У нас есть определённая адресация реализованная для заданной ОС, потому я точно знаю, сколько байт занимает адрес(т.е. мы имеем константу для размера адреса памяти). Потому указатель, при прогнозируемом нормальном поведении, должен занимать константный объём памяти. Хотя эти рассуждения пустяк, ибо стандарт говорит обратное. Или стандарт просто не даёт гарантии ? Так стандарт и не должен давать гарантии. Если есть закон запрещающий воровать, то это не значит что люди не будут воровать. Тонкие моменты, хотя казалось бы что ответ очевиден
Если-бы ты смотрел в историю строительства вычислительной техники (Процессоры, адресная шина,
шина данных и универсальная шина) то не так бы бил "поклоны" на стандарт. Это документ который
создавался в догонку к господствующей архитектуре. Вот я кодил на asm/tasm для IBM/PC. И на асмах
для Электроники БК и Z-80. Там нет понятия указатель. Есть разные целые числа 16/32/64 bit которые рассматривают
как относительные, абсолютные и прочие косвенные способы указать на ячейку памяти. В современных
motherboards EМНИП универсальная шина адресует от 36 до 48 bit памяти (пускай знающие поправят
если я ошибся). Последня цифра позволяет адресовать 280 терабайт физ. ячеек. И адресная модель
не связана как 1:1 с разрядностью процессора. Это вообще отдельная тема.

Указатель - это попытка уйти от Assembler-like кодинга и подойти к универсальному способу описания
адреса без сведений о самом целом которое оно представляет. Сам по себе физический смысл целого
числа - неприемлим. Например безсмысленно складывать два значения указателя.

А знания о том сколько занимает разрядная сетка. Зачем? Сериализовать его на диск? К чему?
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806035
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, AFAIK не правы Вы

Вы смотрите на low low low уровень. Z80 и прочее.

Вроде в "продвинутых" архитектурах типа Эльбруса, к созданию которых Бабаян примазывался, была аж защита памяти на уровне данных. Т.е. явно тип указателя в самом указатели кодить приходилось.

Как минимум, читал статью, о советском стековом процессоре, где так же тип указателя и модель адресации кодировалась. Специально вроде под язык Module 2 заточенный. И, вроде, показывали прирост производительности на стандартных американских тестах, за счет переноса реализации защиты и управления типами на ядро процессора

Если брать современное. Java работает по такому же принципу. Стековая архитектура + типизация данных. Такие принципы не с бухты барахты у вундеркиндов Sun'а родились. Все уже давно было

Сам с таким не сталкивался, как и с ЭВМ на основе троичной системы счисления (была и такая в СССР). Но все это конец 70-80-ые годы.

AFAIK И понятие указатель в ASM был всегда. А то странно "относительные, абсолютные и прочие косвенные способы указать на ячейку памяти " есть, а "указателя" нет. Это как в анекдоте про маленького мальчика "жопа есть, а слова нету". IMHO
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806050
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevAFAIK И понятие указатель в ASM был всегда. А то странно "относительные, абсолютные и прочие косвенные способы указать на ячейку памяти " есть, а "указателя" нет.IMHOНу и где в прямой или регистровой адресации указатель?
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806056
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я говорю о том что если разработчик пытается спуститься на левел
"разрядности" указателя то возникает вопрос что он дальше с ним будет
делать? У меня был свой интерес например в 64 битных указателях
искать неспользуемые биты. Инкапсулировать нечто вроде RTTI
прямо в указатель.

Но эта задача выходила за рамки программирования на стандартном "С".
Она в своей постановке уже говорила сама за себя что это будет
гибридная разработка. С + Asm.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806075
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ меня был свой интерес например в 64 битных указателях
искать неспользуемые биты.Архитектура x86-64 определяет, что в двенадцати старших неиспользуемых битах должны быть или все нули или все единицы, а маскировать их перед загрузкой из памяти в регистры - себе дороже. IMHO.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806078
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovmaytonУ меня был свой интерес например в 64 битных указателях
искать неспользуемые биты.Архитектура x86-64 определяет, что в двенадцати старших неиспользуемых битах должны быть или все нули или все единицы, а маскировать их перед загрузкой из памяти в регистры - себе дороже. IMHO.
+1 Умная тема. Пойду покачаю доки на тему x86-64.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806119
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AMD64 Architecture Programmer’s Manual Volume 1: Application Programming :64-bit Canonical Addresses
Long mode defines 64 bits of virtual address, but implementations of the AMD64 architecture may support fewer bits of virtual address.
Although implementations might not use all 64 bits of the virtual address, they check bits 63 through the most-significant implemented bit to see if those bits are all zeros or all ones.
An address that complies with this property is said to be in canonical address form.
If a virtual-memory reference is not in canonical form, the implementation causes a general-protection exception or stack fault.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806122
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саша,
в стандарте только гарантия, что-то char один байт и констрейнты, укладывающие все типы данных в неубывающую последовательность по размеру.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806146
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, похоже моя шняга взлетает только на Спектрумах. Спс за ссылку.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806156
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonпохоже моя шняга взлетает только на Спектрумах.Не только - борланд (тоже) использовал старший бит в своём рантайме.
Что (потом) создало проблемы с выделением процессу двух и более гигабайт памяти
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806243
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBM/360 ещё не упоминали, где старший байт можно использовать по своему усмотрению(после последующих расширений правда один бит остался)
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806321
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто документ который создавался в догонку к господствующей архитектуре.
над этим я конечно подумаю.

Мы так и не ответили на главный вопрос.
При нормальном поведении системы, отсутствии undefined behavior, в конкретной операционной системе, может ли указатель в С/С++ на разные объекты занимать разный объём памяти. Если да, то приведите пожалуйста конкретный пример.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806383
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymaytonЭто документ который создавался в догонку к господствующей архитектуре.
над этим я конечно подумаю.

Мы так и не ответили на главный вопрос.
При нормальном поведении системы, отсутствии undefined behavior, в конкретной операционной системе, может ли указатель в С/С++ на разные объекты занимать разный объём памяти. Если да, то приведите пожалуйста конкретный пример.
Я думаю что в 99.9% современных компилляторов используется единая memory model.
Физически это будет либо 32 либо 64 бита и без "миксов" внутри
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806385
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryХотя вот вам ещё пример.
Код: plaintext
1.
2.
int* a[10];
int (*b)[10];



в чём разница ?

Поскольку a[10] - это указатель на int, то int* a[10] - это указатель на указатель на int, то есть int **a, насколько я понял.
При увеличении этого указателя на 1, он сдвинется на количество байт равное длине указателя.

А int (*b) [10] это указатель на 10 целых int, при увеличении его на 1, он сдвинется на sizeof(int)*10 байт.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806396
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETSashaMercuryХотя вот вам ещё пример.
Код: plaintext
1.
2.
int* a[10];
int (*b)[10];



в чём разница ?

Поскольку a[10] - это указатель на int, то int* a[10] - это указатель на указатель на int, то есть int **a, насколько я понял.
При увеличении этого указателя на 1, он сдвинется на количество байт равное длине указателя.

А int (*b) [10] это указатель на 10 целых int, при увеличении его на 1, он сдвинется на sizeof(int)*10 байт.a - указатель на массив из 10 элементов типа int, b - массив из 10 указалей на int )))
и это мы ещё не добрались до указаелей на массивы указателей на функции ( принимающие в качестве параметров указатели на функции ) )))
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806405
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury.NET
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void swap(int *a, int *b)
{
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;

	return;
}




1.Что вам не нравится в этой функции с точки зрения функционала ?
2. В каком случае она сработает некорректно ?

1. Все нравится.
2. Незнаю. Может если только *a и *b ссылаются на пересекающиеся участки памяти. )
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806406
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych.NETпропущено...


Поскольку a[10] - это указатель на int, то int* a[10] - это указатель на указатель на int, то есть int **a, насколько я понял.
При увеличении этого указателя на 1, он сдвинется на количество байт равное длине указателя.

А int (*b) [10] это указатель на 10 целых int, при увеличении его на 1, он сдвинется на sizeof(int)*10 байт.a - указатель на массив из 10 элементов типа int, b - массив из 10 указалей на int )))
и это мы ещё не добрались до указаелей на массивы указателей на функции ( принимающие в качестве параметров указатели на функции ) )))


точно ?;)
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806417
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryв конкретной операционной системе, может ли указатель в С/С++ на разные объекты занимать разный объём памяти. Если да, то приведите пожалуйста конкретный пример.да ё, размер указателя зависит от платформы, а не от языка. Поэтому, если платформа имеет указатели разного размера, то и язык, на ней реализованный, должен это позволять. Пример от WhiteOwl это никакой не UB, а вполне себе допустимая ситуация на 16-разрядных DOS ( и Windows16, кстати, тоже ).
Стандарт не может постулировать размер указателя, очевидно же.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806419
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryточно ?;)может и наоборот ;)
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806430
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryточно ?;)может и наоборот ;)

:D
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806434
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETSashaMercuryпропущено...


1.Что вам не нравится в этой функции с точки зрения функционала ?
2. В каком случае она сработает некорректно ?

1. Все нравится.
2. Незнаю. Может если только *a и *b ссылаются на пересекающиеся участки памяти. )

1.Хорошо, я подкорректирую первый вопрос. Что вам не нравится с точки зрения алгоритма (не затрагиваются вопросы скорости )
2. Может быть ;) Приведите уже пример, тут вариантов не много, касаемо того что вы написали
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806439
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NET,
по первому вопросу вам никак не может всё нравится
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806477
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Если a и b один и тот же адрес, то данные по нему обнулятся.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806499
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETSashaMercury,

Если a и b один и тот же адрес, то данные по нему обнулятся.

fe
Код: plaintext
1.
2.
int a=10;
swap(&a,&a);


действительно так
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806511
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фу блин. Бином Ньютона....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void swap(int *a, int *b)
{
        if (a==b) return; // "WTF! You stuped code-monkey! WTF! :)"
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;
	return;
}
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806516
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercuryв конкретной операционной системе, может ли указатель в С/С++ на разные объекты занимать разный объём памяти. Если да, то приведите пожалуйста конкретный пример.да ё, размер указателя зависит от платформы, а не от языка. Поэтому, если платформа имеет указатели разного размера, то и язык, на ней реализованный, должен это позволять. Пример от WhiteOwl это никакой не UB, а вполне себе допустимая ситуация на 16-разрядных DOS ( и Windows16, кстати, тоже ).
Стандарт не может постулировать размер указателя, очевидно же.

Спасибо.

Доброго времени суток C:
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806933
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETSashaMercuryХотя вот вам ещё пример.
Код: plaintext
1.
2.
int* a[10];
int (*b)[10];



в чём разница ?

Поскольку a[10] - это указатель на int, то int* a[10] - это указатель на указатель на int, то есть int **a, насколько я понял.
При увеличении этого указателя на 1, он сдвинется на количество байт равное длине указателя.

А int (*b) [10] это указатель на 10 целых int, при увеличении его на 1, он сдвинется на sizeof(int)*10 байт.

то что я выделил красным мне не очень понравилось.
Код: plaintext
1.
2.
int* a[10];
int *a1[10];



что a,что a1 есть массивы из 10 указателей на int. а и a1 указатель на указатель.

а как будет "читать" система второй участок кода ?
Код: plaintext
1.
int (*b) [10];



PS
тот алгоритм, что вы привели для функции swap, будет работать только для тех типов данных, для которых можно выполнить операцию побитового исключающего или(т.е. операнды функции будут целочисленные), вы не сможете, например, переделать его для double. с классической функцией таких проблем нет.
Код: plaintext
1.
2.
3.
4.
5.
6.
void swap(T* a,T* b)
{
   T temp=*a;
   *a=*b;
   *b=temp;
}
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38806966
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то был еще один боянчик. Вот.

15464736
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38807729
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSashaMercuryЯ рассуждаю так. У нас есть определённая адресация реализованная для заданной ОС, потому я точно знаю, сколько байт занимает адрес(т.е. мы имеем константу для размера адреса памяти).Неправильно вы рассуждаете.
В x86 - сегментная память, поэтому существуют NEAR16, NEAR32, FAR16 и FAR32. NEAR32 и FAR16 - одинаковы по размеру, но различаются по интерпретации.
еще там есть huge...
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38807770
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivеще там есть huge...Это FAR16 с отдельными сегментами для стека и данных.
...
Рейтинг: 0 / 0
Зачем компилятору языка С знать на какой тип указывает указатель.
    #38807962
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETТо есть можно ли создать в программе два указателя с разным размером.
Чтобы sizeof(type1*) == sizeof(type2*) было ложно.

В некоторых гарвардских архитектурах для некоторых моделей памяти размеры указателей различаются. Пример: AVR, компилятор IAR, размер указателя на память данных 8/16 бит, на память программ — 16/24 бит в зависимости от опций компиляции.
...
Рейтинг: 0 / 0
56 сообщений из 56, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Зачем компилятору языка С знать на какой тип указывает указатель.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]