Почему
1. char stroka [7] = {'s','t','r','o','k','a','\0'}; и char stroka2 [7] = {'s','t','r','o','k','a'}; это не одно и тоже, но если я попытаюсь вывести строки
printf ("%s\n", stroka2); printf ("%s\n", stroka); - то выведется одно и тоже. В чем тогда их различия?
2. char massiv[5]; - т. к имя массива это указатель на его первый элемент (то есть он работает с адресами), то почему при вводе в него значения с помощью scanf (" %s", massiv);, знак & не нужно использовать? Если он работает с адресами, то и я же ему должен отдавать адрес.
3. И чем вообще отличаются литеральные строки от массива символов?
Другие языки программирования и технологии
Язык си, не понял несколько моментов по массивам и строкам
1. В том, что в первом случае у тебя в первой строке будет явно записан конец строки, во втором нет, но не инициализированные явно элементы массива будут заполнены нулями, что эквивалентно концам строки. Выведется строка, естественно, до первого символа конца строки.
2, Имя массива не просто указатель на его первый элемент, оно только приводится к нему при необходимости. Но указатель уже хранит адрес, поэтому знак & для получения адреса не нужен.
3, В конец литеральных строк компилятор автоматически добавляет символ конца строки, в массив символов - нет.
2, Имя массива не просто указатель на его первый элемент, оно только приводится к нему при необходимости. Но указатель уже хранит адрес, поэтому знак & для получения адреса не нужен.
3, В конец литеральных строк компилятор автоматически добавляет символ конца строки, в массив символов - нет.
1. вот чесгря не помню, что стандарт по этому поводу говорит, но тут два варианта: либо во втором случае седьмой элемент забивается нулём (и тогда разницы действительно нет), либо там может быть любой мусор, и тогда тебе просто повезло, что у тебя вывело "stroka", а не "stroka�= �H�G(H;G0s9H�PH�", например. Очевидно, что первый вариант лучше, т. к. однозначно задаётся всё содержимое массива.
2. scanf не "работает с адресами", ему просто необходимо обращаться к данным по ссылке, а не по значению, чтобы их изменять. В случае базовых типов для этого используются указатели, но в случае строк это не нужно, т. к. и так передаётся указатель, по которому можно записывать введённые данные и впоследствии получить их там, откуда был вызван scanf
3. практически ничем, разве что в литеральных строках автоматически в конец дописывается 0, а вот в литеральных массивах символов ничего такого не происходит
2. scanf не "работает с адресами", ему просто необходимо обращаться к данным по ссылке, а не по значению, чтобы их изменять. В случае базовых типов для этого используются указатели, но в случае строк это не нужно, т. к. и так передаётся указатель, по которому можно записывать введённые данные и впоследствии получить их там, откуда был вызван scanf
3. практически ничем, разве что в литеральных строках автоматически в конец дописывается 0, а вот в литеральных массивах символов ничего такого не происходит
Роман Помазанов
спасибо, 3 ответ действительно понял.
2. То есть просто нужно запомнить когда ставить в сканф &, а когда нет?
2. То есть просто нужно запомнить когда ставить в сканф &, а когда нет?
Murtik Orazmenliyev
Ссылок в С нет. Зачем путаете человека.
вот когда нужно напечатать содержимое, например, int a, тогда нужно указать &a
Похожие вопросы
- Язык си, двухмерный массив и функция.
- Язык Си: В одномерном массиве, состоящем из n вещественных элементов, вычислить: номер максимального по модулю элемента
- Язык СИ. Массивы Ребят, как на Си написать сортировку массива от меньшего к большему?
- Помогите.Массивы.Язык Си.
- Помогите с массивом и сортировкой методом пузырька в языке Си! Прогу надо сдать в пятницу срочно, не знаю как начать!
- Язык Си|Будет ли ошибкой, если я буду увеличивать размер массива по мере ввода в него?
- Поменять местами первый и последний отрицательные элементы массива B (18). (Язык Си) (Язык Си)
- Двумерный массив. Язык Си.
- помогите пожалуйста проверить код на языке си, программа работает неверно - не выдает сумму массива Z
- Удалить знаки пунктуации из строки. Язык Си.
char*i=&cymbol;