Другие языки программирования и технологии

Язык си, не понял несколько моментов по массивам и строкам

Почему
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, В конец литеральных строк компилятор автоматически добавляет символ конца строки, в массив символов - нет.
Миха Байкалов
Миха Байкалов
88 819
Лучший ответ
Роман Помазанов то есть %s сам автоматически дописывает '\0'?
Роман Помазанов 2. Но я же если хочу присвоить указателю адрес переменной, то использую знак &, например:
char*i=&cymbol;
1. вот чесгря не помню, что стандарт по этому поводу говорит, но тут два варианта: либо во втором случае седьмой элемент забивается нулём (и тогда разницы действительно нет), либо там может быть любой мусор, и тогда тебе просто повезло, что у тебя вывело "stroka", а не "stroka�= �H�G(H;G0s9H�PH�", например. Очевидно, что первый вариант лучше, т. к. однозначно задаётся всё содержимое массива.

2. scanf не "работает с адресами", ему просто необходимо обращаться к данным по ссылке, а не по значению, чтобы их изменять. В случае базовых типов для этого используются указатели, но в случае строк это не нужно, т. к. и так передаётся указатель, по которому можно записывать введённые данные и впоследствии получить их там, откуда был вызван scanf

3. практически ничем, разве что в литеральных строках автоматически в конец дописывается 0, а вот в литеральных массивах символов ничего такого не происходит
Роман Помазанов спасибо, 3 ответ действительно понял.
2. То есть просто нужно запомнить когда ставить в сканф &, а когда нет?
Murtik Orazmenliyev Ссылок в С нет. Зачем путаете человека.
вот когда нужно напечатать содержимое, например, int a, тогда нужно указать &a
Алла Тменова
Алла Тменова
21 700