Чтение строки с помощью scanf
Я немного запутался в чем-то. У меня сложилось впечатление, что правильный способ чтения строки C с scanf() пошел по линии
(не обращайте внимания на возможное переполнение буфера, это просто пример)
char string[256];
scanf( "%s" , string );
однако, следующее, кажется, тоже работает,
scanf( "%s" , &string );
это просто мой компилятор (gcc), чистая удача, или что-то еще?
3 ответов:
массив "распадается" на указатель на его первый элемент, так что
scanf("%s", string)эквивалентноscanf("%s", &string[0]). С другой стороны,scanf("%s", &string)передает указатель-к-char[256], но он указывает на то же место.затем
scanf, при обработке хвоста его списка аргументов, будет пытаться вытащитьchar *. Это правильно, когда вы прошли вstringили&string[0], но когда вы прошли в&stringвы зависите от чего-то, что языковой стандарт не гарантирует, а именно что указатели&stringи&string[0]-- указатели на объекты разных типов и размеров, которые начинаются в одном месте и представлены таким же образом.Я не думаю, что когда-либо сталкивался с системой, на которой это не работает, и на практике вы, вероятно, в безопасности. Тем не менее, это неправильно, и он может потерпеть неудачу на некоторых платформах. (Гипотетический пример: реализация "отладки", которая включает информацию о типе С каждым указателем. Я думаю C реализация на символике "Lisp Machines" сделала что-то вроде этого.)
в случае строки (символьного массива) сама переменная указывает на первый элемент рассматриваемого массива. Таким образом, нет необходимости использовать оператор ‘&’ для передачи адреса.
‘&’ используется для получения адреса переменной. C не имеет a тип строка, строка-это просто массив символов и массив переменная хранит адрес первого расположения индекса.
по умолчанию сама переменная указывает на основание адрес и поэтому для доступа к базовому адресу строки нет необходимости добавление дополнительного‘&'
я думаю, что это ниже, является точной, и это может помочь. Не стесняйтесь исправлять его, если вы обнаружите какие-либо ошибки. Я новичок в C.
char str[]
- массив значений типа char, с собственным адресом в памяти
- массив значений типа char, с собственным адресом в памяти столько последовательных адресов, сколько элементов в массиве
включая нулевой символ завершения
''&str,&str[0]иstr, все три представляют собой то же самое расположение в памяти, которое является адресом первого элемента массиваstrchar * strPtr = &str[0]; //объявление и инициализация
кроме того, вы можете разделить это на два:
char *strPtr; strPtr = &str[0];
strPtrуказатель наcharstrPtrуказывает на массивstrstrPtr- это переменная со своим собственным адресом вstrPtr- это переменная, которая хранит значение адреса&str[0]strPtrсобственный адрес в памяти отличается от адреса памяти, который он хранит (адрес массива в памяти a.k.a &str[0])&strPtrпредставляет собой адрес самого strPtrя думаю, что можно объявить указатель на указатель, как:
char **vPtr = &strPtr;объявляет и инициализирует с адресом указателя strPtr
в качестве альтернативы вы можете разделить в два:
char **vPtr; *vPtr = &strPtr
*vPtrуказывает на указатель strPtr*vPtr- это переменная со своим собственным адресом в*vPtr- это переменная, которая хранит значение address & strPtr- последнее замечание: вы не можете сделать
str++,strадресconst, но вы можете сделатьstrPtr++
Comments