2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3  След.
 
 Re: C/С++ массивы, указатели
Сообщение04.09.2016, 15:46 
arseniiv в сообщении #1148990 писал(а):
А с остальными именами вы разобрались, значит?


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

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

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

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

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

 
 
 
 Re: C/С++ массивы, указатели
Сообщение04.09.2016, 19:18 
12d3 в сообщении #1148997 писал(а):
Возможно, вам поможет понимание, где в памяти во время выполнения программы какие переменные располагаются и чему равно их значение.


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

 
 
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 08:34 
venco писал(а):
Стандарт, кажется, нигде не требует, чтобы первый элемент массива лежал с самого начала, с тем же адресом, что и у всего массива.


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

 
 
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 10:44 
И правда требует:
Цитата:
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 
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 
venco в сообщении #1149314 писал(а):
И где тут требование? "Can be converted" не означает, что адреса равны.
Если понимать неформальное требование "адреса равны" как "can be converted", то означает. Смысла понимать его иначе - например, как равенство чисел, в которые конвертятся разнотиповые указатели - я не вижу, именно потому что указатели разнотиповые.

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

 
 
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 19:17 
venco в сообщении #1149415 писал(а):
ТС интересовало именно численное значение адреса, то, что печатает оператор вывода указателя.
Ну, я надеюсь, благодаря вашему замечанию и последовавшему обмену репликами он (и все остальные) не поймёт моё сообщение превратно.

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

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

 
 
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 20:42 
Ну memcpy() не показатель, низкоуровневая функция, которая мало чего обещает.
А вот если в стандарте найдётся требование, что sizeof(A[N]) == N*sizeof(A), то это будет означать, что адрес массива обязательно равен адресу первого элемента. Но у меня под рукой стандарта нет.

 
 
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 21:00 
Аватара пользователя
Цитата:
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 
Да, действительно, как я мог забыть. Можно ещё вспомнить calloc(), хотя динамические и статические массивы могли вести себя по разному.
В общем, на этом можно закончить. Первый элемент начинается сразу, и имеет тот же физический адрес, что и весь массив, иначе просто элементы в отведённую память не поместятся.

 
 
 
 Re: C/С++ массивы, указатели
Сообщение05.09.2016, 21:25 
На всякий случай приведу цитату из стандарта (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  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group