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

 
 
> Указатели на строку в С
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

Сообщений в этой теме
- 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, 05:21) По ...   Jan 25 2016, 07:43
|- - GetSmart   Цитата(Сергей Борщ @ Jan 25 2016, 11:43) ...   Jan 25 2016, 07:56
|- - Сергей Борщ   Цитата(GetSmart @ Jan 25 2016, 09:56) Пре...   Jan 25 2016, 08:08
|- - 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 Текстовая версия Сейчас: 27th August 2025 - 06:26
Рейтинг@Mail.ru


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