|
|
  |
Как в си объявить массив с возможностью изменения его размера? |
|
|
|
Jul 8 2011, 10:15
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(vvs157 @ Jul 8 2011, 15:02)  .. в случае динамичесого массива, созданного через calloc/malloc это точно будет не так. Потому как это совершенно разные вещи. Динамического массива в виде идентификатора не существует, существует указатель на него или просто пустой указатель. А это уже совсем другая история. Адрес функции, кстати, тоже можно брать через амперсанд, и у неё к сожалению или счастью нет индекса. Цитата(skripach @ Jul 8 2011, 15:08)  UPD: Т.е. запись &abc просто нелогична, ну как получить адрес адреса. Однако, компиляторописатели (хвала аллаху, что zltigo не из них) думают, что логична. Т.к. результат - всегда адрес. И глаз программера этот амперсанд так же примечает.
Сообщение отредактировал GetSmart - Jul 8 2011, 10:16
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 10:23
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (GetSmart @ Jul 8 2011, 12:45)  void *p; } Замените КАК ЭТО СДЕЛАНО В ПЕРВОИСТОЧНИКЕ: u16 *p И компилятор ответит, что он думает "Чему равен p"
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 10:28
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jul 8 2011, 15:23)  Замените КАК ЭТО СДЕЛАНО В ПЕРВОИСТОЧНИКЕ: u16 *p
И компилятор ответит, что он думает "Чему равен p" Адресу массива, не сомневайтесь. Но согласитесь, на УЖАС, УЖАС, УЖАС это не тянет. Так, мелкое хулиганство  Причём меньшее, чем не посылка NAK в протоколе I2C.
Сообщение отредактировал GetSmart - Jul 8 2011, 10:29
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 10:32
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(vvs157 @ Jul 8 2011, 14:24)  Это очень стремная радость. В один прекрасный момент решат, что это не "по фен-шую" и количество головной боли у тех, кто пользуется подобными недокументированными фичами будет весьма велико. А самое главное зачем писать неправильную и более длинную конструкцию Код char abc[10]; char *p = &abc; вместо короткой и правильной Код char abc[10]; char *p = abc;
|
|
|
|
|
Jul 8 2011, 10:40
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (GetSmart @ Jul 8 2011, 13:15)  Однако, компиляторописатели (хвала аллаху, что zltigo не из них) думают, что логична. Т.к. результат - всегда адрес. И глаз программера этот амперсанд так же примечает. Хвала Аллаху, что у компиляторописателей голова растет не из ануса, посему на это: CODE u16 abc[10]; u16 *p;
main() { p = &abc; ... } компиляторрописатели IAR: Error[Pe513]: a value of type "u16 (*)[10]" cannot be assigned to an entity of type "u16 *" а это для разгообразия PowerCraft: (139): operands of = have illegal types `pointer to u16' and `pointer to array 10 of u16t' Реагируют посылкой в анус того, кто так пишет. QUOTE (GetSmart @ Jul 8 2011, 13:28)  Адресу массива, не сомневайтесь. Разуваем глаза и смотрим на вышенаписанное. QUOTE Но согласитесь, на УЖАС, УЖАС, УЖАС это не тянет. Так, мелкое хулиганство  Не соглашусь, однако.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 10:41
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jul 8 2011, 15:34)  Хвала Аллаху, что у компиляторописателей голова растет не из ануса, посему на это: ... Реагируют посылкой в анус того, кто так пишет. Но всё-таки она вертится!? Ведь результат &mass является адресом массива, хоть и с другими атрибутами, чем первый его элемент. Чтобы не париться, его всегда можно присвоить нетипизированному указателю. И это работает не только с массивами, но и с записами, юнионами, функциями и возможно ещё что упустил. Очень интересная новость после стольких лет...
Сообщение отредактировал GetSmart - Jul 8 2011, 10:45
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 10:44
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (sergeeff @ Jul 8 2011, 13:32)  вместо короткой и правильной Более длинная и что важно, тоже правильная конструкция: char *p = &abc[0]; может быть применена для подчеркивания того факта, что abc это массив. Иногда такое бывает удобно при быстром чтении.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 10:48
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (GetSmart @ Jul 8 2011, 13:41)  Но всё-таки она вертится!? Ведь результат &mass является адресом массива, хоть и с другими атрибутами, чем первый его элемент. Что значит "вертится" и "является адресом", если компиляторы ВЫВАЛИВАЕТСЯ с ошибкой и соответственно НЕ генерят никакого кода? Кто здесь пытается вертеться, как уж на сковородке, видно невооруженным взглядом  . QUOTE И это работает не только... Это не работает. Как там было у Задорнова - "Пива нет. СОВСЕМ нет!" - СОВСЕМ не раболтает. О чем я сразу и написал увидя этo: CODE uint16_t Buffer[50]; uint16_t *ptr_buffer; ..... ptr_buffer = &Buffer; Именно ЭТО увидел и именно об ЭТОМ а не чем-то другом написал.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2011, 10:48
|
Местный
  
Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821

|
Цитата(sergeeff @ Jul 8 2011, 11:49)  Указатель лежит в памяти. Адрес указателя - это адрес этой памяти. :-))) Цитата из Вашей ссылки Цитата Очевидно существует очень тесное соответствие между ин- дексацией и арифметикой указателей. в действительности ком- пилятор преобразует ссылку на массив в указатель на начало массива. В результате этого имя массива является указатель- ным выражением. Отсюда вытекает несколько весьма полезных следствий. Так как имя массива является синонимом местополо- жения его нулевого элемента, то присваивание PA=&A[0] можно записать как PA = A По моему Вы и zltigo сомневались и учебники читать отправляли.
|
|
|
|
|
Jul 8 2011, 10:52
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Jul 8 2011, 15:48)  Кто здесь пытается вертеться, как уж на сковородке, видно невооруженным взглядом  . Это смотря какой вопрос. То, что было изначально у ТС я не утверждал, что компилируется (вообще). Но то, что амперсанд можно применять ко многим объектам, включая массивы, и результат будет предсказуем, то бишь равен адресу объекта - я ещё раз повторяю. Если я уж, то сижу спокойно, в центре сковородки
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jul 8 2011, 10:55
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(andron86 @ Jul 8 2011, 13:48)  По моему Вы и zltigo сомневались и учебники читать отправляли. Вы это к чему? Там же ниже прямо написано Цитата конструкции типа A=PA или A++,или P=&A будут незаконными. Чего вы мне хотели сказать?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|