реклама на сайте
подробности

 
 
> Указатели на строку в С
psL
сообщение Jan 24 2016, 08:04
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



В Си есть два способа определения строки:

Код
    char str[] = "string";
    void* p1= str;
    void* p2=&str;
    void* p3=&str[0];

    printf("%p\n%p\n%p\n",p1,p2,p3);

$ a.out
0xbfaa14c5
0xbfaa14c5
0xbfaa14c5


    char* str = "string";
    void* p1= str;
    void* p2=&str;
    void* p3=&str[0];

    printf("%p\n%p\n%p\n",p1,p2,p3);

$ a.out
0x80488bc
0xbfc25c78
0x80488bc


В первом случае p1 равен p2. Почему так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Jan 24 2016, 13:17
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Сергей Борщ)
Любой выполняющий требования стандарта.

То есть по стандарту индекс можно применять к rvalue? Уточняю. Или по-другому заявлено? Это с чистого как слеза Си так задумано?

Сообщение отредактировал GetSmart - Jan 24 2016, 13:19


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 24 2016, 13:55
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Jan 24 2016, 15:17) *
То есть по стандарту индекс можно применять к rvalue? Уточняю. Или по-другому заявлено? Это с чистого как слеза Си так задумано?
Если речь идет о записи "строковый литерал"[индекс], то да - это чистый, как слеза Си. Строковый литерал неявно приводится к указателю на char const, а для указателя определены индексные операции, которые есть адресная арифметика. Отсюда в чистом как слеза Си возможно и такая запись: i["abcdef"].


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 24 2016, 17:28
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Сергей Борщ @ Jan 24 2016, 17:55) *
Если речь идет о записи "строковый литерал"[индекс], то да - это чистый, как слеза Си. Строковый литерал неявно приводится к указателю на char const, а для указателя определены индексные операции, которые есть адресная арифметика. Отсюда в чистом как слеза Си возможно и такая запись: i["abcdef"].

Конец цитаты точно верный?

В индексировании строки будет аж два подряд неявных преобразования. На этом стандарт должен акцентировать внимание. Сперва строка создаст lvalue и значение превратится в указатель, а потом указатель должен неявно превратиться переменную, к которой применим индекс. Т.к. такое выражение полнейшая экзотика, то какие-то компиляторописатели могли бы встать на грабли, если в стандарте нет подсказки.

Т.к. неявное преобразование строки происходит в указатель на char, то таки одно неявное преобразование. Индексирование указателя на массив и указателя на другой не пустой тип происходит по-разному. Опять в свой огород закинул.

Сообщение отредактировал GetSmart - Jan 25 2016, 04:22


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 24 2016, 18:45
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Jan 24 2016, 19:28) *
Конец цитаты точно верный?
Точно. Зуб даю. Ну слегка опечатался: должно было быть "возможна".

Цитата(GetSmart @ Jan 24 2016, 19:28) *
а потом указатель должен неявно превратиться переменную, к которой применим индекс.
Откройте стандарт и почитайте, что делает оператор индекса. Стандарт легко гуглится.

Цитата
A postfix expression followed by an expression in square brackets [] is a subscripted
designation of an element of an array object. The definition of the subscript operator []
is that E1[E2] is identical to (*((E1)+(E2)))
.
От перемены мест слагаемых сумма не меняется.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 25 2016, 03:21
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Сергей Борщ @ Jan 24 2016, 22:45) *
От перемены мест слагаемых сумма не меняется.

По поводу выделенного в цитате. Если бы там вместо definition было "действие", то всё было бы корректно к асимметрии взятия элемента массива. Т.к. в предыдущем предложении она обозначена и наследуется следующим предложением. В таком виде как написано толковать его можно как допускающее перемену мест двух выражений у оператора [], если в описании оператора "+" не указана явно зависимость результата от перестановки слагаемых обсуждаемых типов. (насколько это определение старое? в нете коментарии о New C standard)

Касательно семантики идеального Си, без всяких плюшек и перегрузок Си++.

В сложении чисел перемена мест слагаемых унаследована из математики. Т.к. к указателю удобно применять сложение, то разрешив его логично и наследование правила перемены мест слагаемых, если какого-то альтернативного результата не может быть, например из-за (гипотетических) неявных преобразований указателя в число (или адрес или содержимое памяти) когда по соседству у него "третьим" (первые два - число и указатель) будет оператор или операнд, требующий данное неявное преобразование. У понятия взятия элемента массива обычно две составные части выражения исходно разнотипные и это действие семантически несимметричное. Например, как in в Паскале. Оснований делать его симметричным в Си не обозначено, а усложнение читабельности и искажение понятия налицо. Здесь асиметрия сильно увеличивает безопасность. В том же стандарте Си наверняка в разделе объявлений переменных (конкретно массивов) указано (например неявно), что нет никакой симметрии и имя массива всегда вне []. Без наличия оснований ввода в стандарт симметрии операндов оператора [] в разделе statement, стандарт будет кривым. Прямо в Си-стандарте, а не в стандарте "соседнего" языка.

Сообщение отредактировал GetSmart - Jan 25 2016, 07:53


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2016, 07:43
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Jan 25 2016, 05:21) *
По поводу выделенного в цитате. Если бы там вместо definition было "действие",
definition = определение. То есть операция [] определяется и работает именно так, только так и никак иначе.

Цитата(GetSmart @ Jan 25 2016, 05:21) *
если какого-то альтернативного результата не может быть, например из-за (гипотетических) неявных преобразований указателя в число
Не надо гипотез. В стандарте все описано. И неявные преобразования, и коммуникативность сложения. Операция разыменования указателя ('*') определена только для указателей, значит результатом суммы должен быть указатель. Сумма дает указатель только если одно из слагаемых указатель, а второе - целое число. Порядок слагаемых не важен. Все описано и ничего выдумывать не нужно.
Цитата
One of the expressions shall have type ‘‘pointer to object type’’, the other expression shall have integer type, and the result has type ‘‘type’’.
Все. "одно из выражений" и "другое выражение". Где из них какое - не сказано и значения не имеет, что следует из отцитированного выше определения (definition). И массив не нужен, нужен указатель.

Цитата(GetSmart @ Jan 25 2016, 05:21) *
У понятия взятия элемента массива
Нет такого понятия. Есть доступ по индексу.
Цитата(GetSmart @ Jan 25 2016, 05:21) *
В том же стандарте Си наверняка в разделе объявлений переменных (конкретно массивов) указано (например неявно), что нет никакой симметрии и имя массива всегда вне [].
Во-первых давайте без "наверняка". Найдите и покажите. Я за вас искать не буду. "Чтение документации из интернета вслух - 100 евро в час". Во-вторых, объявление массива и операция доступа по индексу - совершенно разные и никак не связанные между собой вещи.

На этом заканчиваю. Не имею желания опровергать ваши фантазии. Читайте стандарт самостоятельно, там есть ответы на все ваши вопросы.

Цитата(GetSmart @ Jan 25 2016, 05:21) *
Прямо в Си-стандарте, а не в стандарте "соседнего" языка.
Это вообще к чему?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 25 2016, 07:56
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Сергей Борщ @ Jan 25 2016, 11:43) *
definition = определение. То есть операция [] определяется и работает именно так, только так и никак иначе.

Я так и понял. Весь остальной мой абзац корректен.

Цитата(Сергей Борщ @ Jan 25 2016, 11:43) *
Это вообще к чему?

Предполагал некоторую связь с Си++. Например термин subscript не очень ясен. Слабо похож на русский "взятие элемента массива" или даже "индексирование".

Обобщая правила в Си, относящиеся к агрегатным типам, всегда операция взятия субэлемента сложного типа является асимметричной к типу операндов.

Плюсование/минусование указателя удобно в языке, но происходит в особом порядке. Компилятор этот случай детектит специально. В этом случае у операций +/- могла быть разрешена симметрия, по желанию разработчиков, из-за симметрии с числовыми операндами. Но можно было бы и жёстко задать: указатель слева, числа справа.

Сообщение отредактировал GetSmart - Jan 25 2016, 08:11


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2016, 08:08
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Jan 25 2016, 09:56) *
Предполагал некоторую связь с Си++.
В заголовке темы явно указан Си. Далее, вы сами писали о "чистом как слеза Си" и я вам отвечал именно о нем же, даже специально дважды повторил предлженное вами название.
Цитата(GetSmart @ Jan 25 2016, 09:56) *
Например термин subscript не очень ясен.
translate.google.com, технические словари вам в помощь.

Цитата(GetSmart @ Jan 25 2016, 09:56) *
Обобщая правила в Си,
Которых вы не читали. Выше добавил в сообщение еще одну цитату из стандарта.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- psL   Указатели на строку в С   Jan 24 2016, 08:04
- - amaora   В первом случае нет переменных хранящих адрес масс...   Jan 24 2016, 10:17
|- - zltigo   QUOTE (amaora @ Jan 24 2016, 12:17) В пер...   Jan 24 2016, 10:35
- - Сергей Борщ   Цитата(psL @ Jan 24 2016, 10:04) В Си ест...   Jan 24 2016, 10:32
|- - psL   Цитата(Сергей Борщ @ Jan 24 2016, 13:32) ...   Jan 24 2016, 11:26
|- - zltigo   QUOTE (psL @ Jan 24 2016, 13:26) Почему у...   Jan 24 2016, 11:34
||- - psL   Цитата(zltigo @ Jan 24 2016, 14:34) В это...   Jan 24 2016, 11:42
|- - SSerge   Цитата(psL @ Jan 24 2016, 18:26) чем отли...   Jan 24 2016, 11:36
|- - amaora   Цитата(psL @ Jan 24 2016, 14:26) разве им...   Jan 24 2016, 12:13
- - _Ivan_33   а почему 2? а строковый литерал типа #define MSG ...   Jan 24 2016, 11:10
- - zltigo   QUOTE (psL @ Jan 24 2016, 13:42) * Без K&R обь...   Jan 24 2016, 11:51
|- - psL   Цитата(zltigo @ Jan 24 2016, 14:51) Все т...   Jan 24 2016, 12:46
|- - gerber   Цитата(psL @ Jan 24 2016, 15:46) Можете к...   Jan 24 2016, 13:03
- - GetSmart   Wow! Индекс разрешили применять к rvalue? Цит...   Jan 24 2016, 12:54
|- - Сергей Борщ   Цитата(GetSmart @ Jan 24 2016, 14:54) Как...   Jan 24 2016, 13:11
|- - zltigo   QUOTE (GetSmart @ Jan 24 2016, 15:17) То ...   Jan 24 2016, 13:51
||- - GetSmart   Цитата(zltigo @ Jan 24 2016, 17:51) Смотр...   Jan 24 2016, 14:05
||- - krux   Цитата(GetSmart @ Jan 24 2016, 17:05) Кла...   Jan 24 2016, 14:20
|- - GetSmart   Цитата(Сергей Борщ @ Jan 25 2016, 12:08) ...   Jan 25 2016, 08:16
|- - Сергей Борщ   Цитата(GetSmart @ Jan 25 2016, 10:16) По ...   Jan 25 2016, 08:54
|- - GetSmart   Цитата(Сергей Борщ @ Jan 25 2016, 12:54) ...   Jan 25 2016, 10:01
|- - Сергей Борщ   Цитата(GetSmart @ Jan 25 2016, 12:01) ...   Jan 25 2016, 10:34
|- - GetSmart   Цитата(Сергей Борщ @ Jan 25 2016, 14:34) ...   Jan 25 2016, 10:50
|- - CrimsonPig   Цитата(GetSmart @ Jan 25 2016, 10:50) Пос...   Jan 25 2016, 11:47
|- - Сергей Борщ   Цитата(CrimsonPig @ Jan 25 2016, 13:47) А...   Jan 25 2016, 12:21
||- - GetSmart   Цитата(Сергей Борщ @ Jan 25 2016, 16:21) ...   Jan 25 2016, 12:40
||- - GetSmart   Цитата(Сергей Борщ @ Jan 25 2016, 16:21) ...   Jan 25 2016, 13:08
|- - GetSmart   Цитата(CrimsonPig @ Jan 25 2016, 15:47) А...   Jan 25 2016, 13:53
|- - zltigo   QUOTE (GetSmart @ Jan 25 2016, 15:53) Обс...   Jan 25 2016, 14:33
- - gerber   "ABCD" не является rvalue, строго говоря...   Jan 24 2016, 14:16
|- - GetSmart   Цитата(gerber @ Jan 24 2016, 18:16) ...   Jan 24 2016, 14:22
|- - krux   Цитата(GetSmart @ Jan 24 2016, 17:22) Цит...   Jan 24 2016, 14:23
|- - Сергей Борщ   Цитата(GetSmart @ Jan 24 2016, 16:05) В с...   Jan 24 2016, 14:43
|- - GetSmart   ЦитатаЭто как? foo2( "ABCD" + "XYZ...   Jan 24 2016, 15:02
|- - zltigo   QUOTE (GetSmart @ Jan 24 2016, 17:02) foo...   Jan 24 2016, 15:24
|- - Сергей Борщ   Цитата(GetSmart @ Jan 24 2016, 17:02) foo...   Jan 24 2016, 15:28
- - GetSmart   Дополнил конец пред поста.   Jan 24 2016, 14:27
|- - krux   Цитата(GetSmart @ Jan 24 2016, 17:22) Воо...   Jan 24 2016, 14:38
- - GetSmart   Если строки складываются без плюса, то я не сильно...   Jan 24 2016, 15:30
|- - zltigo   QUOTE (GetSmart @ Jan 24 2016, 17:30) Есл...   Jan 24 2016, 15:42
- - GetSmart   Тогда есть отличия с взятием адреса массива через ...   Jan 24 2016, 15:55
- - SSerge   Кабы авторы языка С в своё время были так же искус...   Jan 25 2016, 08:01
- - GetSmart   Нашёл такую формулировку ЦитатаA postfix expressio...   Jan 25 2016, 12:19
|- - Сергей Борщ   Цитата(GetSmart @ Jan 25 2016, 14:19) В э...   Jan 25 2016, 12:46
||- - GetSmart   Цитата(Сергей Борщ @ Jan 25 2016, 16:46) ...   Jan 25 2016, 22:19
||- - Сергей Борщ   Цитата(GetSmart @ Jan 26 2016, 00:19) Пиш...   Jan 25 2016, 23:06
||- - zltigo   QUOTE (GetSmart @ Jan 26 2016, 00:19) Я н...   Jan 26 2016, 07:30
||- - GetSmart   Цитата(zltigo @ Jan 26 2016, 11:30) Как р...   Jan 26 2016, 11:53
|- - zltigo   QUOTE (GetSmart @ Jan 25 2016, 14:19) Клю...   Jan 25 2016, 13:15
|- - gerber   Цитата(zltigo @ Jan 25 2016, 16:15) 1) Я ...   Jan 25 2016, 13:19
||- - zltigo   QUOTE (gerber @ Jan 25 2016, 15:19) И как...   Jan 25 2016, 13:20
||- - gerber   Цитата(zltigo @ Jan 25 2016, 16:20) Как и...   Jan 25 2016, 13:23
||- - zltigo   QUOTE (gerber @ Jan 25 2016, 15:23) Хм .....   Jan 25 2016, 13:27
||- - gerber   Цитата(zltigo @ Jan 25 2016, 16:27) Но во...   Jan 25 2016, 15:02
||- - zltigo   QUOTE (gerber @ Jan 25 2016, 17:02) Как п...   Jan 25 2016, 15:39
|- - GetSmart   Цитата(zltigo @ Jan 25 2016, 17:15) Это ф...   Jan 25 2016, 13:19
- - gerber   Стандарт стандартом, но за работу с элементами мас...   Jan 25 2016, 13:12
- - GetSmart   Цитата(Сергей Борщ @ Jan 26 2016, 03:06) ...   Jan 25 2016, 23:46
|- - Сергей Борщ   Цитата(GetSmart @ Jan 26 2016, 01:46) С к...   Jan 26 2016, 00:31
|- - GetSmart   Цитата(Сергей Борщ @ Jan 26 2016, 04:31) ...   Jan 26 2016, 00:39
|- - Сергей Борщ   Цитата(GetSmart @ Jan 26 2016, 02:39) Нап...   Jan 26 2016, 08:41
- - sigmaN   Честно прочитал все сообщения. Так и не понял поче...   Jan 26 2016, 16:30
|- - Serg76   Цитата(sigmaN @ Jan 26 2016, 19:30) Вроде...   Jan 26 2016, 21:16
- - smalcom   Welcome to electronix ))   Jan 26 2016, 20:05
- - GetSmart   ЦитатаAn operator is called a Postfix Operator whe...   Feb 5 2016, 20:41
- - sigmaN   ЦитатаЕсли ерунда содержится в какой-то части стан...   Feb 6 2016, 10:51
- - krux   GetSmart пока ваш 'компилятор' не может со...   Feb 8 2016, 19:06
- - ar__systems   Это тему больно читать.... А когда вы работать ус...   Feb 9 2016, 14:24


Closed TopicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th August 2025 - 21:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01557 секунд с 7
ELECTRONIX ©2004-2016