2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 Re: C/С++ массивы, указатели
Сообщение04.09.2016, 15:46 


03/04/14
303
arseniiv в сообщении #1148990 писал(а):
А с остальными именами вы разобрались, значит?


Ну вроде да...
Ну остальные имена это какие?
Имена указателей и переменных как я понимаю именованные области памяти.
int a = 1;
Вот переменная a это область в памяти где хранится 1.
int *pa = &a
Вот переменная типа указатель на int, так же область в памяти где хранится адрес переменной а.
Что еще?

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение04.09.2016, 15:56 
Заслуженный участник


27/04/09
28128
bayah в сообщении #1149038 писал(а):
Ну остальные имена это какие?
Все остальные, о которых говорит стандарт C++, видимо. Константы, аргументы функций, функции, поля записей… Потом, имена бывают и у типов, и пространства имён тоже не безымянны.

bayah в сообщении #1149038 писал(а):
Имена указателей и переменных как я понимаю именованные области памяти.
Имена — это именованные области памяти. Я лично ничего не понял. :roll:

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение04.09.2016, 16:29 
Заслуженный участник


02/08/11
7003
bayah в сообщении #1149038 писал(а):
Вот переменная типа указатель на int, так же область в памяти где хранится адрес переменной а.
Хотелось бы на всякий случай подчеркнуть, что в коде
Код:
int *pa1 = &a;
int *pa2 = &a;

переменные pa1 и pa2 — разные, то есть это две разные области памяти, в обоих из которых лежит, конечно, один и тот же адрес.

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение04.09.2016, 19:18 


03/04/14
303
12d3 в сообщении #1148997 писал(а):
Возможно, вам поможет понимание, где в памяти во время выполнения программы какие переменные располагаются и чему равно их значение.


Спасибо, вроде дошло)

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 08:34 


11/12/14
893
venco писал(а):
Стандарт, кажется, нигде не требует, чтобы первый элемент массива лежал с самого начала, с тем же адресом, что и у всего массива.


Вроде бы требует. Лень искать, но точно помню, что для POD-структур такое правило существует: указатель на первый член данных обязан совпадать с указателем на саму структуру. При наличии этого правила для структур думаю с массивом существует аналогичное.

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 10:44 
Заслуженный участник


02/08/11
7003
И правда требует:
Цитата:
An lvalue of type "array of N T" or "array of unknown bound of T" can
be converted to an rvalue of type "pointer to T." The result is a
pointer to the first element of the array.

И ещё есть несколько требований, общий смысл которых, что массив не имеет дополнительных метаданных и не занимает ни одного лишнего байта.

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 16:09 
Заслуженный участник


04/05/09
4587
warlock66613 в сообщении #1149189 писал(а):
И правда требует:
Цитата:
An lvalue of type "array of N T" or "array of unknown bound of T" can
be converted to an rvalue of type "pointer to T." The result is a
pointer to the first element of the array.
И где тут требование? "Can be converted" не означает, что адреса равны.

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 16:21 
Заслуженный участник


02/08/11
7003
venco в сообщении #1149314 писал(а):
И где тут требование? "Can be converted" не означает, что адреса равны.
Если понимать неформальное требование "адреса равны" как "can be converted", то означает. Смысла понимать его иначе - например, как равенство чисел, в которые конвертятся разнотиповые указатели - я не вижу, именно потому что указатели разнотиповые.

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 19:15 
Заслуженный участник


04/05/09
4587
warlock66613 в сообщении #1149321 писал(а):
venco в сообщении #1149314 писал(а):
И где тут требование? "Can be converted" не означает, что адреса равны.
Если понимать неформальное требование "адреса равны" как "can be converted", то означает. Смысла понимать его иначе - например, как равенство чисел, в которые конвертятся разнотиповые указатели - я не вижу, именно потому что указатели разнотиповые.
ТС интересовало именно численное значение адреса, то, что печатает оператор вывода указателя.

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 19:17 
Заслуженный участник


02/08/11
7003
venco в сообщении #1149415 писал(а):
ТС интересовало именно численное значение адреса, то, что печатает оператор вывода указателя.
Ну, я надеюсь, благодаря вашему замечанию и последовавшему обмену репликами он (и все остальные) не поймёт моё сообщение превратно.

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 19:43 


11/12/14
893
venco

Быстро не находится, поисковый запрос просто находит миллион обсуждений про array-to-pointer conversion, а надо немного другое. Просто ключевые слова те же.
Однако вот какое рассуждение можно провести - memcpy( &arr, ... ) и memcpy( arr, ... ) были бы разными по поведению вещами, а это уж черезчур. Наверняка про это есть в стандарте.

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 20:42 
Заслуженный участник


04/05/09
4587
Ну memcpy() не показатель, низкоуровневая функция, которая мало чего обещает.
А вот если в стандарте найдётся требование, что sizeof(A[N]) == N*sizeof(A), то это будет означать, что адрес массива обязательно равен адресу первого элемента. Но у меня под рукой стандарта нет.

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 21:00 
Заслуженный участник
Аватара пользователя


16/07/14
9145
Цюрих
Цитата:
EXAMPLE 2 Another use of the sizeof operator is to compute the number of elements in an array:
Используется синтаксис C
sizeof array / sizeof array[0]

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 21:12 
Заслуженный участник


04/05/09
4587
Да, действительно, как я мог забыть. Можно ещё вспомнить calloc(), хотя динамические и статические массивы могли вести себя по разному.
В общем, на этом можно закончить. Первый элемент начинается сразу, и имеет тот же физический адрес, что и весь массив, иначе просто элементы в отведённую память не поместятся.

 Профиль  
                  
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 21:25 
Заслуженный участник


02/08/11
7003
На всякий случай приведу цитату из стандарта (C++):
Цитата:
5.3.3 Sizeof [expr.sizeof]
When applied to an array, the result is the total number of bytes in the array. This implies that the size of an array of n elements is n times the size of an element.
Но этого совершенно не достаточно, чтобы утверждать, что указатель на массив и указатель на первый элемент массива будут иметь одно и то же числовое значение после конвертации в целый тип, так как стандарт, насколько мне известно, не накладывает никаких ограничений на числовое представление указателей, кроме возможности обратного преобразования в указатель того же типа. А ведь
venco в сообщении #1149415 писал(а):
ТС интересовало именно численное значение адреса, то, что печатает оператор вывода указателя.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу Пред.  1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group