|
|
  |
Си |
|
|
|
Feb 28 2013, 07:45
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(demiurg_spb @ Feb 28 2013, 10:39)  На платформе АVR и так и сяк будет двойной расход памяти flash + копия в озу пока явно не зададим __flash. Это так к слову... На MSP430 - все литеральные строки хранятся во флэше. А для инициализированных массивов, если я не хочу переносить их п память, достаточно добавить constПопутно. Оффтопик. Как вам удается редактировать свои сообщения, без того чтобы было написано "изменен тогда-то и тем-то"?
|
|
|
|
|
Feb 28 2013, 07:58
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(igorle @ Feb 28 2013, 11:45)  На MSP430 - все литеральные строки хранятся во флэше. А для инициализированных массивов, если я не хочу переносить их п память, достаточно добавить const Это всё понятно. У MSP430 единое адресное пространство - просто и удобно... И про повсеместный static const я как бы тоже в теме. Меня интересует конкретный отсыл в стандарт и только... Цитата Попутно. Оффтопик. Как вам удается редактировать свои сообщения, без того чтобы было написано "изменен тогда-то и тем-то"? Также как и вам. Нажимаю редактировать -> быстрое... В avr-gcc вообще все очень непросто со строковыми литералами. Можете почитать нашу дискуссию на сей счёт: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56263И был бы очень рад если ещё кто-то меня поддержит в ней!
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 28 2013, 08:27
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(demiurg_spb @ Feb 28 2013, 10:58)  Также как и вам. Нажимаю редактировать -> быстрое... Я так делаю - обязательно пишет что меняли текст. Цитата Можете почитать нашу дискуссию на сей счёт Почитал. Познавательно. Я сам с AVR не работаю.
|
|
|
|
|
Feb 28 2013, 08:29
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(demiurg_spb @ Feb 28 2013, 11:39)  Это объяснение не на том уровне. Хотелось бы в контексте Си стандарта... Запросто - С99 стандарт, глава 6.4.5 (String Literals), параграф 5 Цитата In translation phase 7, a byte or code of value zero is appended to each multibyte character sequence that results from a string literal or literals. The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. Так что возвращать из функции можно
|
|
|
|
|
Feb 28 2013, 08:33
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(XVR @ Feb 28 2013, 12:29)  О! Вот это вразумительно! Спасибо! Приятно осознавать что ты поумнел после содержательной беседы. Серьёзно. Отдельное спасибо igorle!
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 28 2013, 12:11
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
igorle ,вы привели программу Код void foo1(int argc, char **argv) { while (argc--) printf("\"%s\"\n", argv++); }
void foo(void) { char *my_argv[] = {"Hello", "World", "one", "two", "four"};
foo1(5, my_argv); } Мне кажется, что argv не указатель на указатель, скорее это указатель на массив указателей ! И в аргументах функции foo1 правильнее будет записать *argv[] вместо **argvИ в том виде в котором Вы запостили, код не компилится и нужно либо в аргументах printf разыменовывать argv либо использовать квадр. скобки и индекс для каждого элемента массива. Мне больше нравится вот так: Код void foo1(char *argv[]) { while (*argv) printf("\"%s\"\n", *argv++); }
int main(void) { char *my_argv[] = {"Hello", "World", "one", "two", "four", NULL}; foo1(my_argv); } Мы подчеркнули природу аргумента функции foo1 ,но вынуждено используем "указательные" св-ва масива для упорядоченного, с начала в конец, вывода элементов на "печать". Кароче трудно как-то все получается
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Feb 28 2013, 13:49
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата Мне кажется, что argv не указатель на указатель, скорее это указатель на массив указателей ! И в аргументах функции foo1 правильнее будет записать *argv[] вместо **argv С точки зрения языка С, в данном случае (для прототипа функции), обе записи равнозначны. Используйте то, что вам понятнее. Со временем придет "чуство" того, что имя массива и указатель - это одно и то-же. Цитата ... код не компилится ... Да, это я ошибся. Нужно *argv++Ваш вариант, с последним элементом NULL, правильный, тем более что функция main действительно получает массив argv размером на единицу больше, чем argc, с NULL терминатором. Цитата Мы подчеркнули природу аргумента функции foo1 ,но вынуждено используем "указательные" св-ва масива для упорядоченного, с начала в конец, вывода элементов на "печать". Короче, трудно как-то все получается  Массив и указатель - близнецы братья. При использовании - это одно и то-же. Немного практики, и это станет простым и естественным. И будет непонятно, как некоторые языки не используют указатели. Верной дорогой идете!
Сообщение отредактировал igorle - Feb 28 2013, 13:50
|
|
|
|
|
Feb 28 2013, 14:52
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Указатель и массив - это не одно и то же. Но имя массива - это указатель на первый его элемент a[0] то же самое что и *a a[10] то же самое что и *(a+10)
Понятно, что при определении переменной int a[] и int *b - разные вещи. Но после этого они во многом ведут себя одинаков. Во многом, но не во всем. a нельзя присваивать новое значение, b - можно.
int a[10]; int *b = a;
Теперь все, что вы хотите делать с a, вы можете делать с b. Обратное не верно Например b[2] - это то-же самое что и a[2].
Я считаю, что это из области, где легче понять чем объяснить. Даже гугл не поможет. И приходит только с небольшим опытом. Просто поиграйте с указателями. Потом - с указателями на указатели. Это действительно просто. Наш экспириенс не поможет. Можете придумыват, писать и компилировать простые примеры из нескольких строк, и задавать конкретные вопросы если не работает. Когда поймете то что говорили про указатели и массивы - посмотрите примеры про обработку связных списков. Там указатели на указатели очень эффективно работают.
Можете порешать олимпиаду, про которую я говорил в соседней ветке. Там тоже про указатели на указатели. Если не выиграете приз, то хоть согреетесь.
Сообщение отредактировал igorle - Feb 28 2013, 14:54
|
|
|
|
|
Mar 1 2013, 02:45
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(igorle @ Feb 28 2013, 18:52)  Указатель и массив - это не одно и то же. Но имя массива - это указатель на первый его элемент Дьявол в мелочах (с). Тот случай, когда пренебежение терминологией, привело к не верному выводу. А именно, "указатель" != "адрес". Имя массива - не "указатель" на первый элемент, а "адрес" первого элемента. P.S. Оказывается, объяснить тоже не сложно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|