powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R Многомерные массивы
25 сообщений из 66, страница 2 из 3
K&R Многомерные массивы
    #38552801
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким образов это ложное(в том смысле что по факту никакого приведения не происходит) приведение типов уводит от рекурсии через саму себя ?
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38552809
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_TЕсли ты изначально объявил одномерный массив, то как компилятор узнает чему равно M ?


Всё верно. Теперь понял логику )
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38552819
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКаким образов это ложное(в том смысле что по факту никакого приведения не происходит) приведение типов уводит от рекурсии через саму себя ?
Оно происходит. При компиляции.
Соответственно оно не ложное :)
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38552822
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Происходит приведение по типу int* к int *
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38552829
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПроисходит приведение по типу int* к int *
Нет.
Код: plaintext
1.
2.
int a[1];
int* b = &a;  // разные типы - не откомпилируется
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38552832
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аа, верно.
ну да, имя массива это уже указатель
int a[1];
int* b=a;//так надо
а что я делаю когда пишу
int* b=&a;//я пытаюсь записать адрес по которому хранится адрес начала массива a ?
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38552844
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryадрес по которому хранится адрес начала массива a
слишком много эпитетов.
проще надо говорить: указатель на массив :)
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38552867
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
int a[300];
int* b=a; // b разве не указатель на массив ?
сейчас b содержит адрес первого элемента массива ?? я ведь правильно понимаю ?

Я аж испугался что что-то не понимаю, проверил !
Код: plaintext
1.
2.
3.
4.
	int a[1];
	int* b = a;
	int* b1 = (int*)&a;
	printf("%p %p", b, b1);



Два абсолютно одинаковых адреса. Вы не до конца что-то мне говорите. Либо я что-то не знаю, а вы думаете что я знаю. Одно из двух на 100 процентов..


Код: plaintext
1.
int* b1 = (int*)&a;


И всё-таки, что тут происходит ?




Всем спасибо!
Всем хороших выходных C:

SS
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38552923
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДва абсолютно одинаковых адреса. Вы не до конца что-то мне говорите. Либо я что-то не знаю, а вы думаете что я знаю. Одно из двух на 100 процентов..
Есть понятие "тип данных".
Один и то же набор байтиков может с точки зрения языка иметь совершенно разный смысл.
В данном случае
Код: plaintext
1.
2.
3.
4.
5.
6.
int a[1]; // массив, имеет тип: int [1] 
&a; // указатель на массив, имеет тип: int (*)[1]
int* b; // указатель на значение, тип  int*
b = a;  // компилятор неявно преобразует  из int [1] в int* (поскольку такое преобразование часть языка)
b = &a;  // компилятор не может неявно преобразовать  из int (*)[1] в int* 
         // поскольку такого неявного преобразования в языке нет
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38555180
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Anatoly Moskovsky
int a[1]; // массив, имеет тип: int [1]
&a; // указатель на массив, имеет тип: int (*)[1]
int* b; // указатель на значение, тип int*
b = a; // компилятор неявно преобразует из int [1] в int* (поскольку такое преобразование часть языка)
b = &a; // компилятор не может неявно преобразовать из int (*)[1] в int*
// поскольку такого неявного преобразования в языке нет


K&RОчевидно существует очень тесное соответствие между индексацией и арифметикой указателей. в действительности компилятор преобразует ссылку на массив в указатель на начало массива. В результате этого имя массива является
указательным выражением.

И теперь исходя из комментария от K&R ваша запись

b = &a;


Вообще не имеет никакого смысла. Исходя из того что я знаю.

Например запись

Код: plaintext
1.
2.
3.
4.
5.
b = &a[0][0]; 

OR

b=a;


ясны и несут очевидный смысл.

Когда мне может понадобиться

b = &a;


?

И

SashaMercuryКаким образов это приведение типов уводит от рекурсии через саму себя ?
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38555221
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИ теперь исходя из комментария от K&R ваша запись

b = &a;


Вообще не имеет никакого смысла. Исходя из того что я знаю.
Зачем вы мне это говорите, когда я выше написал
Код: plaintext
1.
int* b = &a;  // разные типы - не откомпилируется


Что непонятно в слове "не откомпилируется"?

SashaMercuryКаким образов это приведение типов уводит от рекурсии через саму себя ?
Формула вычисления элемента массива ссылалась на вычисление 0-го элемента - что является рекурсией (бесконечной). Чтобы устранить рекурсию, 0-й элемент вычисляется по-другому - приведением адреса массива.
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38555239
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я перечитал ваше сообщение

Anatoly MoskovskyТаким образом получаем:
*(&a[0] + x)



Да, тут забыл еще одно преобразование, для устранения рекурсии определения [], через самого себя.

Адрес 0-го элемента &a[0] вычисляется так (element_type *)&a
(т.к. адрес массива и 0-го элемента совпадают в физическом представлении)

Т.е. итоговая формула такая:
*((element_type *)&a + x)



с учётом того что выв мне написали сегодня


Ооооо!!
Я понял, мне это нравится !!!! Я его полностью понял, от рекурсии до каждой скобки! Очень хорошее выражение, теперь мне оно очень нравится !)))
Мне кажется вместо всяких тестов на знание Си, можно показать это выражение ( и ещё плюс тот отличнейший пример от Дмитрия), и понять понимает ли человек язык хотя бы средне или нет
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38556514
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня с трудом заснул, думал про эту формулу. Насколько тут всё здорово.
Anatoly Moskovsky, а где вы это прочитали ? Что компилятор так преобразует ? Может я что-то завышаю, но я на 90 процентов уверен, что если спросить 100 среднестатистических программистов почему int a[x]~*((element_type_x*)&a+x), то ответит максимум 5.
K&R ещё не до конца изучил, неужели дальше это будет ?
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38556515
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
под тильдой я имел ввиду эквивалентность как математический символ, а не оператор C
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38556533
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryя на 90 процентов уверен, что если спросить 100 среднестатистических
программистов почему int a[x]~*((element_type_x*)&a+x), то ответит максимум 5.
Обычно начинающих сильнее ставит в тупик вопрос "почему (int*)0 + 1 == 4".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38556555
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня следующее предположение, 0 приводится к указателю, и при добавлении единички работает арифметика указателей, то есть добавляют 4 байта на int, и возвращается 4.Возникает два вопроса
1)Почему (int*)a=a (где а in Z, не переменная)
2)почему возможен возврат числа не кратному 4, но видимо ответ из 1 вопроса

Если мне есть ещё смысл думать, то я подумаю, если я вообще не в ту степь смотрю, то вы лучше подскажите
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38556556
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
f e:
printf("%i",(int*)17+10 );

вернёт 57
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38556577
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryУ меня следующее предположение, 0 приводится к указателю, и при добавлении единички работает арифметика указателей, то есть добавляют 4 байта на int, и возвращается 4.Возникает два вопроса
1)Почему (int*)a=a (где а in Z, не переменная)
не понял о чем речь
SashaMercury2)почему возможен возврат числа не кратному 4, но видимо ответ из 1 вопроса
если ты про это
SashaMercuryf e:
printf("%i",(int*)17+10 );

вернёт 57
то все верно:
(int*)17 - указатель на байт памяти с адресом 17. Нет никаких ограничений чтобы начальный адрес был кратен 4. Память адресуется побайтно.
+10 как ты уже понял 10 раз по 4 байта (sizeof(int)).

SashaMercuryЕсли мне есть ещё смысл думать, то я подумаю, если я вообще не в ту степь смотрю, то вы лучше подскажите
Наверно есть смысл прекращать теорию изучать и написать что-нибудь простое, для закрепления теории на практике.
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38556583
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SS

Дайте какое-нибудь задание C:
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38556585
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSПочему (int*)a=a (где а in Z, не переменная


a in Z, это как в Tex, число "а" принадлежит целым числам, но не переменная, то есть не объявлена как int a;
f e: (int*)100. 100-это и есть a


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

Дайте какое-нибудь задание C:
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38556622
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurySSПочему (int*)a=a (где а in Z, не переменная

a in Z, это как в Tex, число "а" принадлежит целым числам, но не переменная, то есть не объявлена как int a;
f e: (int*)100. 100-это и есть a
Код: plaintext
1.
(int*)100 = ...


В реальном коде такого не надо писать. Это запись в ячейки памяти с адресами 100, 101, 102, 103.
Уже как-то писал что в реальном коде такое невозможно, т.к. конкретные адреса в памяти выделяются ОС и программа работает с теми адресами что ей дали, поэтому конкретное значение указателя нужно только для сравнения его с другим указателем на тот же массив.
SashaMercuryДайте какое-нибудь задание C:
В книжках ничего нет?

Напиши что-нибудь классическое с использованием указателей. Например сортировка массива и двоичный поиск по нему
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38556710
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ его полностью понял
SashaMercuryСегодня с трудом заснул, думал про эту формулу

Предлагаю для проверки понимания перед сном подумать над тем как будет вычислено выражение:
Код: plaintext
1.
3["abcdef"]
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38557182
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вышел из дома, компилятора тут нет, только C# к сожалению. Попробую предположить.

3["abcdef"]. Видим операцию [], значит получим *(3+"abcdef")..мне кажется что abcdef запишется в памяти в соответствии с ASCII, и будет прочитано число как int.Хотя стоп, это 6 байт,а int 4 байта.Нет. Вероятнее добавится 6 байт, даже 7, ещё конец массива. На выходе будет 10. Верно ?
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38557285
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ вышел из дома, компилятора тут нет, только C# к сожалению. Попробую предположить.

3["abcdef"]. Видим операцию [], значит получим *(3+"abcdef")..мне кажется что abcdef запишется в памяти в соответствии с ASCII, и будет прочитано число как int.Хотя стоп, это 6 байт,а int 4 байта.Нет. Вероятнее добавится 6 байт, даже 7, ещё конец массива. На выходе будет 10. Верно ?

Нет.

Подумай, какого типа и значения выражение

Код: plaintext
1.
"abcdef"
...
Рейтинг: 0 / 0
K&R Многомерные массивы
    #38557959
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,спасибо..
3+97 значит.Адрес сдвинется на 97. Вернёт 100.Проверил уже.
Что-же я сразу не догадался что будет сдвиг на значение указателя на начало строки (
...
Рейтинг: 0 / 0
25 сообщений из 66, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R Многомерные массивы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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