Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 12 13 14 15 16 [17] 18 19 20 21   вперед  Ctrl
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
Dimitry Sibiryakov

petrav
Что мы там видим? Разве видим мы там массив? Или разве видим мы там указатель на массив? Нет!

Почему не видим? Мы не можем написать aaa[2]? Компилятор это не сожрёт? Можем! Сожрёт!
Значит это таки массив.

Нет. Это указатель с адресной арифметикой, а не массив. Вы же всё понимаете... :)
20 май 20, 18:17    [22136598]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50076

petrav
И указатель к массиву не приводится.

Всё, для чего определён оператор [] - массив.
Всё, для чего определён (унарный) оператор * - указатель.

Можешь написать "aaa[2]" - значит это таки массив. Был ааа объявлен как int*, значит таки
приводится.

Posted via ActualForum NNTP Server 1.5

20 май 20, 18:19    [22136599]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
Dimitry Sibiryakov

petrav
И указатель к массиву не приводится.

Всё, для чего определён оператор [] - массив.
Всё, для чего определён (унарный) оператор * - указатель.

Можешь написать "aaa[2]" - значит это таки массив. Был ааа объявлен как int*, значит таки
приводится.

Приведение типов создано, что бы переменные типа А присваивать переменным типа Б. Покажите мне, плиз, как указатель присвоить массиву? Похожесть интерфейсов разных классов не означает, что эти классы эквивалентны.
20 май 20, 18:24    [22136602]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 46600
Ну что. Будем смотреть ассеблер? Или никому не интересно?
20 май 20, 18:25    [22136603]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3219
mayton
Ну что. Будем смотреть ассеблер? Или никому не интересно?
Мне не интересно. Я много видел того, во что превращаются конструкции C++ при компиляции. :) Иногда даже пользуюсь ключом -S для GNUC'а.
20 май 20, 18:28    [22136605]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50076
petrav
Покажите мне, плиз, как указатель присвоить массиву?

Внезапно, но неявное приведение работает только у rvalue, а оператор присваивания
определён только для lvalue. Примитивный массив не работает эль-валуём и неспособен к нему приводиться.

Сообщение было отредактировано: 20 май 20, 18:38
20 май 20, 18:36    [22136614]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 46600
Мне кажется что при реверс-инжинеринге мы не сможем восстановить был ли это pointer или array.
20 май 20, 18:41    [22136618]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
a guest
Member

Откуда:
Сообщений: 256
mayton
Мне кажется что при реверс-инжинеринге мы не сможем восстановить был ли это pointer или array.
А некоторые и до компиляции одно от другого отличить не могут.
20 май 20, 18:42    [22136621]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
Dimitry Sibiryakov
petrav
Покажите мне, плиз, как указатель присвоить массиву?

Внезапно, но неявное приведение работает только у pvalue, а оператор присваивания
определён только для lvalue. Примитивный массив не работает эль-валуём и неспособен к нему приводиться.

Вот в этом и косяк проектирования языка Си.

Что все типы в Си способны выступать как lvalue, а массив нет, не может. Все типы в Си можно передавать как по значению, так и по указателю. Но массив этими обоими способами передать нельзя. Можно только передать в функцию указатель на элемент массива, но не на массив.

Это ли не накосячили? Я уважительно отношусь к авторам, но правда дороже.
20 май 20, 18:45    [22136622]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
a guest
Member

Откуда:
Сообщений: 256
petrav
Что все типы в Си способны выступать как lvalue, а массив нет, не может.
Адрес ты как тогда от массива берёшь, если он не может "выступать как lvalue"?
20 май 20, 18:48    [22136623]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3219
a guest, мы уже перетирали эту тему почти два года назад 21461521.
Припоминаешь? :)
20 май 20, 18:51    [22136626]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
a guest
petrav
Что все типы в Си способны выступать как lvalue, а массив нет, не может.
Адрес ты как тогда от массива берёшь, если он не может "выступать как lvalue"?

Ну если может, то приведите пример, когда массив стоит по левую сторону от оператора присваивания.
20 май 20, 18:51    [22136627]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
a guest
Member

Откуда:
Сообщений: 256
petrav
a guest
пропущено...
Адрес ты как тогда от массива берёшь, если он не может "выступать как lvalue"?

Ну если может, то приведите пример, когда массив стоит по левую сторону от оператора присваивания.
Т.е. в C lvalue типа массива не может быть аргументом оператора "&" ?
20 май 20, 18:53    [22136628]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
a guest
petrav
Я просто хочу разделить понятия:

1. Массив с точки зрения системы типов.
Я тоже в 22135653 хотел разделить понятия:
1. Массива как типа (ну или семейства типов, если совсем уж педантствовать)
2. Массива как объекта с соответствующим типом
3. Переменной, которая вводится объявлением с известными свойствами.

Но ты это воспринял как будто я заявляю, что в коде вроде
int main()
{
    int b;
    int c[3];
}
"b" будет именем переменной, а "c" — не будет.

Ну, видимо, произошло недопонимание. Бывает. Я считаю, что тут "b" и "c" — это переменные.
20 май 20, 18:55    [22136629]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6494
petrav
Что все типы в Си способны выступать как lvalue, а массив нет, не может. Все типы в Си можно передавать как по значению, так и по указателю. Но массив этими обоими способами передать нельзя. Можно только передать в функцию указатель на элемент массива, но не на массив.

Когда массив в поле структуры то все передается, т.е. нет запрета на копирование массивов ))
И да, имя массива это lvalue.
То что невозможно присвоить туда и передать по значению это просто соглашение, так решили. Технической причины скорее всего нет (возможно она была в момент создания С).
20 май 20, 18:56    [22136630]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
a guest
petrav
пропущено...

Ну если может, то приведите пример, когда массив стоит по левую сторону от оператора присваивания.
Т.е. в C lvalue типа массива не может быть аргументом оператора "&" ?

В Си переменная типа массива не является lvalue. Докажи обратное, плиз. :)
20 май 20, 19:01    [22136632]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
a guest
Member

Откуда:
Сообщений: 256
petrav
a guest
пропущено...
Т.е. в C lvalue типа массива не может быть аргументом оператора "&" ?

В Си переменная типа массива не является lvalue. Докажи обратное, плиз. :)
http://port70.net/~nsz/c/c11/n1570.html#6.5.1p2
20 май 20, 19:05    [22136634]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50076

a guest
в C lvalue типа массива не может быть аргументом оператора "&" ?

Assignment

Objects of array type cannot be modified as a whole: even though they are lvalues (e.g. an
address of array can be taken), they cannot appear on the left hand side of an assignment
operator

Posted via ActualForum NNTP Server 1.5

20 май 20, 19:05    [22136635]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
a guest
Member

Откуда:
Сообщений: 256
Dimitry Sibiryakov, на источник цитаты принято давать ссылку.
20 май 20, 19:08    [22136637]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
Anatoly Moskovsky
petrav
Что все типы в Си способны выступать как lvalue, а массив нет, не может. Все типы в Си можно передавать как по значению, так и по указателю. Но массив этими обоими способами передать нельзя. Можно только передать в функцию указатель на элемент массива, но не на массив.

Когда массив в поле структуры то все передается, т.е. нет запрета на копирование массивов ))

Это понятно. Но это ещё один косяк, то оно копируется, то не копируется. То передаётся по значению, то нет.

Anatoly Moskovsky
И да, имя массива это lvalue.

Можно пример исходного кода где массив Си — это lvalue? Не элемента массива, а массива!

Anatoly Moskovsky
То что невозможно присвоить туда и передать по значению это просто соглашение, так решили. Технической причины скорее всего нет (возможно она была в момент создания С).

И я знаю какая причина была. Вот тут:
int a[3];
int b[3];
a = b;

Они побоялись, что это приведёт, это ошибка скорее всего, это приведёт к потере производительности. И нужно явно написать memcpy(). То что при этом структуры копируются... Не симметрия. И это косяк проектирования.
20 май 20, 19:09    [22136638]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
a guest
petrav
пропущено...

В Си переменная типа массива не является lvalue. Докажи обратное, плиз. :)
http://port70.net/~nsz/c/c11/n1570.html#6.5.1p2

Давай сразу к коду перейдём? К примерам кода.
20 май 20, 19:11    [22136642]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
a guest
Member

Откуда:
Сообщений: 256
petrav
a guest
пропущено...
http://port70.net/~nsz/c/c11/n1570.html#6.5.1p2

Давай сразу к коду перейдём? К примерам кода.
int a[3]; &a; // OK
20 май 20, 19:13    [22136643]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50076

a guest
на источник цитаты принято давать ссылку.

https://en.cppreference.com/w/c/language/array

Posted via ActualForum NNTP Server 1.5

20 май 20, 19:15    [22136646]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
a guest
petrav
пропущено...

Давай сразу к коду перейдём? К примерам кода.
int a[3]; &a; // OK

Ну да. Ты взял ссылку на массив. Дальше что с ней делать? Поиграть как со спинером? Поставь "&a" слева в операторе "присвоить".
20 май 20, 19:20    [22136649]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
a guest
Member

Откуда:
Сообщений: 256
petrav
a guest
пропущено...
int a[3]; &a; // OK

Ну да. Ты взял ссылку на массив. Дальше что с ней делать? Поиграть как со спинером? Поставь "&a" слева в операторе "присвоить".
Сам ставь.
20 май 20, 19:25    [22136650]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 12 13 14 15 16 [17] 18 19 20 21   вперед  Ctrl
Все форумы / C++ Ответить