Здравствуйте, lsv, Вы писали:
lsv>Мне нужно что-то типа: lsv>int *ccc = (int[]){1,2,4}; lsv>но это не работает. lsv>Как написать чтоб работало?
Почему это у тебя не работает? Может быть у тебя компилятор, который не поддрживает С99 (MS Visual C++ его пока не поддерживает (а может быть и никогда не будет)). Можешь попробовать использовать Intel C/C++, для C99 опция /Qc99 для Windows.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
АШ>>Объяснитесь.
L_L>Ему нужен аналог строкового литерала, только это составной целый литерал. В С99 такое возможно.
А чем принципиально отличается в коде использование bbb определенной как int *bbb = (int[]){1, 2, 3, 4}; от int bbb[] = {1, 2, 3, 4};?
Здравствуйте, Анатолий Широков, Вы писали:
АШ>А чем принципиально отличается в коде использование bbb определенной как int *bbb = (int[]){1, 2, 3, 4}; от int bbb[] = {1, 2, 3, 4};?
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Анатолий Широков, Вы писали:
LVV>>>1. Имя массива и есть указатель.
АШ>>Массив приводится к указателю на первый элемент, но это суть две разные сущности. LVV>Мы говорим не о массиве, а об имени массива. Так же как имя функции есть константа — указатель на функцию. Именно поэтому без операций взятия адреса можно имя массива использовать — еще у кернигана и ричи написано было.
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Причем здесь имя? Адрес функции и адрес массива — константы. А вот о допустимых приведениях — 4 в общем, и 4.2, 4.3 в частности — именно благодаря этому мы может использовать конструкции типа:
Имя массиа — это адрес его первого элемента, а адрес — это константа-указатель.
Ну, ИМХО в данном случае приведения только запутывают вопрос для новичка.
Так как массив — это не полноценный тип (его НЕЛЬЗЯ передать по значению, передается только адрес), то говорить здесь о приведениях ИМХО излишне. Я знаю, что в стандарте все это прописано. Но впечатление от этого у меня лично остается такое, что это добавлено для "полноты картины". Так ка ФАКТИЧЕКИ НИКАКОГО приведения в компиляторе не делается. Если б я писал — я именно так и сделал бы.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Инициализация указателя на массив
От:
Аноним
Дата:
23.03.04 09:07
Оценка:
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Vamp, Вы писали:
V>>Лаптев! Не путайте товарища! LVV>>>1. Имя массива и есть указатель. V>>ИМЯ МАССИВА НЕ ЕСТЬ УКАЗАТЕЛЬ. LVV>Есть! Только константа-указатель.
LVV>Имя массиа — это адрес его первого элемента, а адрес — это константа-указатель.
int arr[] = {1, 2, 3, 4};
std::cout << sizeof(arr);
По прежнему будете утвержать, что имя массива трактуется компилятором как адрес его первого элемента?
Если бы это было так, то sizeof(arr) == sizeof(int*).
LVV>Так как массив — это не полноценный тип
Здравствуйте, Lorenzo_LAMAS, Вы писали:
LVV>>Именно поэтому можно писать присваивание для массива без всяких операций взятия адреса. LVV>>А также при передаче параметра в функцию имя массива на месте параметра-указателя пишется без всяких амперсандов.
L_L>Потому, что если Вы напишете с & -то получите адрес массива, т.е. rvalue типа int (*)[размер]
LVV>>Еще у Кернигана и Ричи написано.
L_L>Страницу, абзац, строку оригинала. А еще проще, раз уж так на С потянуло, стандарт C99 поглядеть
Поищу.
Но приведения для массива — это фикция, которую включили в стандарт для "полноты" картины. Так как массив нельзя передать по значению, то говорить здесь о приведении типов — несколько не понятно. Имя массива — это адрес его первого элемента, а адрес — это константа-указатель. О каких преобразованиях, пусть даже и прописанных в стандарте. здесь может идти речь? В компиляторе-то реально ничего не преобразовывается.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, jazzer, Вы писали:
LVV>>>>1. Имя массива и есть указатель.
АШ>>>Массив приводится к указателю на первый элемент, но это суть две разные сущности. LVV>>Мы говорим не о массиве, а об имени массива. Так же как имя функции есть константа — указатель на функцию. Именно поэтому без операций взятия адреса можно имя массива использовать — еще у кернигана и ричи написано было.
J>Все неправильно, кроме последнего предложения.
Это про Кернигана и Ричи?
Спасибо.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
АШ>По прежнему будете утвержать, что имя массива трактуется компилятором как адрес его первого элемента? АШ>Если бы это было так, то sizeof(arr) == sizeof(int*).
Что пардон, то пардон! Все правильно. LVV>>Так как массив — это не полноценный тип
АШ>Массив полноценный тип определенный в 8.3.4
Полноценный тип я могу передавать и возвращать по значению, и по ссылке, и по указателю.
И только для массива возникают исключения — по значению не могу — только по указателю или по ссылке.
Тут я со стандартом не согласен — нечего исключения городить — только начинающий народ запутывают. Получается так: пока мы не связываемся с передачей массива в функцию — все прекрасно мужики! Массив — это массив, он имеет количество элементов, размет и так далее. НО.... как только мы его передаем в функцию — тут у компилятора срочно развивается склероз, он всю эту информацию почему-то забывает и передает в функцию только адрес первого элемента.
Крупная неувязочка! Хотя понятно почему и приходится с этим мириться.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Lorenzo_LAMAS, Вы писали:
LVV>>>Именно поэтому можно писать присваивание для массива без всяких операций взятия адреса. LVV>>>А также при передаче параметра в функцию имя массива на месте параметра-указателя пишется без всяких амперсандов.
L_L>>Потому, что если Вы напишете с & -то получите адрес массива, т.е. rvalue типа int (*)[размер]
LVV>>>Еще у Кернигана и Ричи написано.
L_L>>Страницу, абзац, строку оригинала. А еще проще, раз уж так на С потянуло, стандарт C99 поглядеть LVV>Поищу. LVV>Но приведения для массива — это фикция, которую включили в стандарт для "полноты" картины. Так как массив нельзя передать по значению, то говорить здесь о приведении типов — несколько не понятно. Имя массива — это адрес его первого элемента, а адрес — это константа-указатель. О каких преобразованиях, пусть даже и прописанных в стандарте. здесь может идти речь? В компиляторе-то реально ничего не преобразовывается.
предлагаю помедитировать над следующим кодом
typedef int Arr[5];
void f(Arr& x);
int main()
{
int arr5[5];
int arr6[6];
f(arr5);
f(arr6);
};
Здравствуйте, jazzer, Вы писали:
J>предлагаю помедитировать над следующим кодом J>
J>typedef int Arr[5];
J>void f(Arr& x);
J>int main()
J>{
J> int arr5[5];
J> int arr6[6];
J> f(arr5);
J> f(arr6);
J>};
J>
На компиляторе не проверял, но должна быть ошибка трансляции на второй функции.
Передача массива по ссылке — нормально. Ну и что?
Имеется ввиду, что выполняется контроль типов и "массив другого типа" компилятор не пропускает.
К вопросу о полноценности типа массива. Yes?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Аноним, Вы писали:
V>>>Лаптев! Не путайте товарища! LVV>>>>1. Имя массива и есть указатель. V>>>ИМЯ МАССИВА НЕ ЕСТЬ УКАЗАТЕЛЬ. LVV>>Есть! Только константа-указатель.
А>Надеюсь, вы преподаете не С не C++.
А вы сами преподавали?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, jazzer, Вы писали:
J>>предлагаю помедитировать над следующим кодом J>>
J>>typedef int Arr[5];
J>>void f(Arr& x);
J>>int main()
J>>{
J>> int arr5[5];
J>> int arr6[6];
J>> f(arr5);
J>> f(arr6);
J>>};
J>>
LVV>На компиляторе не проверял, но должна быть ошибка трансляции на второй функции. LVV>Передача массива по ссылке — нормально. Ну и что? LVV>Имеется ввиду, что выполняется контроль типов и "массив другого типа" компилятор не пропускает. LVV>К вопросу о полноценности типа массива. Yes?
No.
Твои слова "Имя массива — это адрес его первого элемента" означают, что тип как arr5, так и arr6 — int*, соответственно, ни один вызов не должен скомпилироваться.
Так что суть именно в приведениях типа — я тебе только что продемонстрировал случай, когда оно не происходит и используется явный тип массива.
А когда оба эти массива можно передать в функцию, принимающую указатель на int — здесь как раз происходит приведение типа от массива к указателю.