Здравствуйте, jazzer, Вы писали:
J>Твои слова "Имя массива — это адрес его первого элемента" означают, что тип как arr5, так и arr6 — int*, соответственно, ни один вызов не должен скомпилироваться.
J>Так что суть именно в приведениях типа — я тебе только что продемонстрировал случай, когда оно не происходит и используется явный тип массива. J>А когда оба эти массива можно передать в функцию, принимающую указатель на int — здесь как раз происходит приведение типа от массива к указателю.
ок.
Но
void f(int x[5]);
J>int main()
J>{
J> int arr5[5];
J> int arr6[6];
J> f(arr5);
J> f(arr6);
J>};
Куда происходит преобразование?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Анатолий Широков, Вы писали:
LVV>>>Имя массиа — это адрес его первого элемента, а адрес — это константа-указатель.
АШ>>
АШ>>По прежнему будете утвержать, что имя массива трактуется компилятором как адрес его первого элемента? АШ>>Если бы это было так, то sizeof(arr) == sizeof(int*). LVV>Что пардон, то пардон! Все правильно. LVV>>>Так как массив — это не полноценный тип
АШ>>Массив полноценный тип определенный в 8.3.4 LVV>Полноценный тип я могу передавать и возвращать по значению, и по ссылке, и по указателю. LVV>И только для массива возникают исключения — по значению не могу — только по указателю или по ссылке. LVV>Тут я со стандартом не согласен — нечего исключения городить — только начинающий народ запутывают. Получается так: пока мы не связываемся с передачей массива в функцию — все прекрасно мужики! Массив — это массив, он имеет количество элементов, размет и так далее. НО.... как только мы его передаем в функцию — тут у компилятора срочно развивается склероз, он всю эту информацию почему-то забывает и передает в функцию только адрес первого элемента. LVV>Крупная неувязочка! Хотя понятно почему и приходится с этим мириться.
см. мое сообщение про ссылки и не путай больше своих студентов.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
LVV>>Куда происходит преобразование?
L_L>Из массива из пяти целых в указатель на первый элемент массива.
Ну вот, и я о том же. L_L>arr5 — имя, обозначающее объект — массив из пяти целых, типа объекта — массив из 5 целых.
ок.
Что ж за неделяы такая — облом за обломом!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Lorenzo_LAMAS, Вы писали:
D>>Если я правильно понял, что именно тебе нужно, то в С++ пока никак, а вот в С99 можно:
L_L>А что, могут такое добавить? Какой-нибудь proposal есть?
У рабочих групп WG14 и WG21 есть стремление опять свести вместе С и С++, особенно в тех местах где нет причин расходиться, так что можно надеятся. Вот ссылка не совсем про это, но там есть отдельный подраздел про составные литералы как в С99 http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1511.pdf.
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Lorenzo_LAMAS, Вы писали:
LVV>>>Куда происходит преобразование?
L_L>>Из массива из пяти целых в указатель на первый элемент массива. LVV>Ну вот, и я о том же.
совсем не о том.
Мы о преобразованиях к типу указателя, которые могут быть, а могут и не быть, а ты — об эквивалентноти имени и указателя.
L_L>>arr5 — имя, обозначающее объект — массив из пяти целых, типа объекта — массив из 5 целых. LVV>ок. LVV>Что ж за неделяы такая — облом за обломом!
Здравствуйте, Lorenzo_LAMAS, Вы писали:
LVV>>Что ж за неделяы такая — облом за обломом!
L_L>Так ведь весна началась!
А, блин! АВИТАМИНОЗ!!!!
Спасибо, теперь хоть не так переживать буду — пройдет!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, jazzer, Вы писали:
LVV>>Что ж за неделяы такая — облом за обломом!
J>Пора в отпуск, вестимо
Ох, года на два — от учебного процесса!
Сидеть дома и писать докторскую , обсуждать с аспирантами их диссеры — и чтоб в институте про меня ЗАБЫЛИ!!!!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, LaptevVV, Вы писали:
LVV>>Это про Кернигана и Ричи?
А>Да нет, это про Вас. Я уверен, что K&R понимают разницу между именем массива и указателем на первый элемент этого массива.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[6]: Инициализация указателя на массив
От:
Аноним
Дата:
23.03.04 11:11
Оценка:
Здравствуйте, LaptevVV, Вы писали:
LVV>А вы сами преподавали?
Нет, не преподавал. Я считаю, что для того чтобы преподавать что-то, нужно этот предмет знать ОЧЕНЬ хорошо. У меня нет проблем с такими базовыми вещами С, как указатели и массивы, но я не считаю, что знаю его настолько хорошо, чтобы идти преподавать.
Re[9]: Инициализация указателя на массив
От:
Аноним
Дата:
23.03.04 14:42
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Здравствуйте, Lorenzo_LAMAS, Вы писали:
АШ>>>Объяснитесь.
L_L>>Ему нужен аналог строкового литерала, только это составной целый литерал. В С99 такое возможно.
АШ>А чем принципиально отличается в коде использование bbb определенной как int *bbb = (int[]){1, 2, 3, 4}; от int bbb[] = {1, 2, 3, 4};?
А что, правда не отличается?
int bbb[] = {1, 2, 3, 4};
С тем, что это инициализация массива и всё законно, думаю все согласятся.
int *bbb = (int[]){1, 2, 3, 4};
А что это?
Инициализация указателя адресом временной переменной?
Я понимаю, что хочется, но можно ли?
Здравствуйте, Аноним, Вы писали:
LVV>>А вы сами преподавали?
А>Нет, не преподавал. Я считаю, что для того чтобы преподавать что-то, нужно этот предмет знать ОЧЕНЬ хорошо. У меня нет проблем с такими базовыми вещами С, как указатели и массивы, но я не считаю, что знаю его настолько хорошо, чтобы идти преподавать.
Знание предмета — это прекрасно. Но еще важнее, КОМУ приходится преподавать. Контингент может быть (и очень часто) таков, что придется упрощать, иначе повыгонешь весь поток. Вот проблема!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
V>>Лаптев! Не путайте товарища! LVV>>>1. Имя массива и есть указатель. V>>ИМЯ МАССИВА НЕ ЕСТЬ УКАЗАТЕЛЬ. LVV>Есть! Только константа-указатель.
Нет, это не "константа-указатель". И не указатель вовсе. Это адрес. Повторять каждое утро. Адрес. По определению адрес — это число, в данном случае — константа. А указатель — это переменная, значением которой является адрес. В случае с именем массива никакой переменной нет и быть не может.
Такие дела.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[11]: Инициализация указателя на массив
От:
Аноним
Дата:
24.03.04 10:36
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
А>>int *bbb = (int[]){1, 2, 3, 4}; А>>А что это? А>>Инициализация указателя адресом временной переменной? А>>Я понимаю, что хочется, но можно ли?
L_L>В С99 можно. Об этом тут сказали раз 10
А может просветите, что это будет означать?
Когда инициализируется массив, там понятно, куда лягут инициализаторы, для них есть место.
А здесь что? будет создан временный массив? А долго он будет жить?
А>А может просветите, что это будет означать? А>Когда инициализируется массив, там понятно, куда лягут инициализаторы, для них есть место. А>А здесь что? будет создан временный массив? А долго он будет жить?
К сожалению, могу только гадать — не знаю С99, а стандарта под рукой в данный момент нет. Если не прав, надеюсь, поправят. Итак, по-моему, такой "литерал" будет аналогом строкового литерала, являться статическим объектом и обладать static storage duration.
Of course, the code must be complete enough to compile and link.