Хрестоматия по программированию на Си в Unix


Массивы, строки, указатели. Хрестоматия по программированию на Си в Unix - стр. 4


В чем ошибка?

#include <stdio.h> /* для putchar */ char s[] = "We don't need no education"; main(){ while(*s) putchar(*s++); }

Ответ: здесь s - константа, к ней неприменима операция ++. Надо написать

char *s = "We don't need no education";

сделав s указателем на безымянный маccив. Указатель уже можно изменять.

Какие из приведенных конструкций обозначают одно и то же?

char a[] = ""; /* пустая строка */ char b[] = "\0"; char c = '\0'; char z[] = "ab"; char aa[] = { '\0' }; char bb[] = { '\0', '\0' }; char xx[] = { 'a', 'b' }; char zz[] = { 'a', 'b', '\0' }; char *ptr = "ab";

Найдите ошибки в описании символьной строки:

main() { char mas[] = {'s', 'o', 'r', 't'}; /* "sort" ? */ printf("%s\n", mas); }

Ответ: строка должна кончаться '\0' (в нашем случае printf не обнаружив символа конца строки будет выдавать и байты, находящиеся в памяти после массива mas, т.е. мусор); инициализированный массив не может быть автоматическим - требуется static:

main() { static char mas[] = {'s', 'o', 'r', 't', '\0'}; }

Заметим, что

main(){ char *mas = "sort"; }

законно, т.к. сама строка здесь хранится в статической памяти, а инициализируется лишь указатель на этот массив байт.

В чем ошибка? Программа собирается из двух файлов: a.c и b.c командой

cc a.c b.c -o ab

a.c b.c

-------------------------------------------------- int n = 2; extern int n; char s[] = "012345678"; extern char *s; main(){ f(){ f(); s[n] = '+'; printf("%s\n", s ); } }

Ответ: дело в том, что типы (char *) - указатель, и char[] - массив, означают одно и то же только при объявлении формального параметра функции:

f(char *arg){...} f(char arg[]){...}

это будет локальная переменная, содержащая указатель на char (т.е. адрес некоторого байта в памяти). Внутри функции мы можем изменять эту переменную, например arg++. Далее, и (char *) и char[] одинаково используются, например, оба эти типа можно индексировать: arg[i]. Но вне функций они объявляют разные объекты! Так char *p; это скалярная переменная, хранящая адрес (указатель):




- Начало -  - Назад -  - Вперед -



Книжный магазин