запрос strcat (string.h) - PullRequest
       8

запрос strcat (string.h)

0 голосов
/ 27 ноября 2009

Сначала: STRCAT:

Cplusplus - strcat

Когда ясно, что определение гласит:

char * strcat ( char * destination, const char * source );

Почему они использовали char str [80] в примере ??? Разве они не должны использовать символьный указатель?

Ответы [ 5 ]

3 голосов
/ 27 ноября 2009
Массив

также можно использовать в качестве указателя. strcat нужен указатель на память, в которую он копирует строку назначения. В этом случае str[80] даст вам память, которая может содержать 80 символов.

3 голосов
/ 27 ноября 2009

Это потому, что массивы распадаются на указатели в C / C ++. Если вы определите char s[80], значение s будет адресом первого символа, т.е. &s[0]

2 голосов
/ 27 ноября 2009
char str[80];

объявляет массив из 80 символов. Однако в C и C ++ массивы неявно преобразуются в указатели. Когда вы передаете массив функции (например, strcat), он автоматически «затухает», образуя указатель на первый элемент массива.

Это не то же самое, что сказать, что массивы и указатели - это одно и то же. Это не так. Например, sizeof() дает разные результаты для вышеуказанного массива, а char*.

0 голосов
/ 27 ноября 2009

Массив - это, строго говоря, указатель на начало блока памяти. Так что str - это char *, который указывает на начало 80 символов.

Когда вы индексируете в массив, скажем, позицию 53, следующее эквивалентно: str[53] совпадает с *(str + 53), так как str это просто char *, а добавление 53 к символьному указателю вернет указатель, чтобы получить значение внутри, вы должны использовать звездочку для разыменования указателя. По сути, запись массива делает код более читабельным при определенных обстоятельствах.

На самом деле отличный маленький трюк с массивами char - это когда вы хотите пропустить какой-то начальный текст при копировании строки. Например. скажем, ваш массив str[80] содержит строку "1023: error in code!". И вы хотите, чтобы отобразить только строку без числа перед. В этом случае вы можете сказать printf( "%s", str + 6 ), и будет напечатан только "error in code!".

0 голосов
/ 27 ноября 2009
char str[80];

Edit: Оппс, я поспешил с ответом. Как говорит dribeas, оператор объявляет массив, и str может быть неявно преобразован в указатель при использовании. Например:

++str;

- недопустимая операция, а:

char* ptr;
++ptr;

нет.

...