|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Почему результат выводится без разыменования указателя?17.10.2016, 16:11. Показов 1819. Ответов 21
Метки нет (Все метки)
char *ptr = "hello";
char *ptr это указатель? Указатель. А указатель это переменная которая содержит адрес данных. Почему тогда при печати printf("%s", ptr); выводится строка? По идее нужно было написать так printf("%s", *ptr); что бы увидеть строку(получить данные указателя). Но так выводит ошибку.
0
|
|
| 17.10.2016, 16:11 | |
|
Ответы с готовыми решениями:
21
Почему не происходит разыменования нулевого указателя?
Почему выводится разный результат? |
|
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
|
||||||
| 17.10.2016, 16:24 | ||||||
|
sys_beginner, тогда уже так:
1
|
||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 17.10.2016, 16:27 [ТС] | |
|
shvyrevvg,
При использовании %s printf сама извлекает данные из адреса?
0
|
|
|
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
|
||
| 17.10.2016, 16:33 | ||
|
char *ptr = "hello"; равносильно char ptr[6] = "hello\0"; ptrinf() перебирает элементы пока не встретит нуль.
0
|
||
|
|
|
| 17.10.2016, 16:39 | |
|
2
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||||||||||||
| 17.10.2016, 16:43 [ТС] | ||||||||||||||||
|
shvyrevvg,
Тогда вопрос. Раз уж для хранения литерала требуется указатель, как объяснить следующее:
Второй пример
А если задать адреса явно, тогда все работает
1. Почему во втором примере для переменных hello и world требуется забирать их адреса, если они уже являются указателями(а как известно указатель уже является адресом). 2. Почему в первом примере создавая массив указателей (учитывая то, что для хранения литерала требуется указатель) достаточно написать char *ptrArr[2] = {"hello", "world"};. То есть достаточно бывает создать 1 указатель вместо указателя на указатель
0
|
||||||||||||||||
|
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
|
|||||
| 17.10.2016, 18:08 | |||||
|
sys_beginner, читайте по указателям инфу, что такое указатель на указатель, что такое массив указателей, и т.д.
![]() ![]() Добавлено через 2 минуты
1
|
|||||
|
|
||||
| 17.10.2016, 18:34 | ||||
hello будет размещен в read-only секции в памяти программы, а адрес его первого символа записан в указатель ptr. Операции записи по такой строке нелегальны. Во втором случае литерал hello\0 будет размещен в read-only секции в памяти программы и будет скопирован в выделенную на стеке память переменной ptr. Писать туда можно. Так что ни разу не равносильно.Обоим участникам обсуждения домашнее задание: сколько символов будет прокопировано в память переменной из этого литерала во втором кейсе? ptrArr представляет собой массив из 2-х элементов каждый из которых указатель на символ.
1
|
||||
|
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
|
||
| 17.10.2016, 19:20 | ||
|
0
|
||
|
|
||
| 17.10.2016, 19:42 | ||
|
1
|
||
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
|||||||
| 17.10.2016, 19:59 | |||||||
|
Вы же в своем коде объявляете указатель, который будет указывать на начало этого безымянного массива символов. Ваш указатель не "хранит" строковый литерал. Ваш указатель лишь указывает на начало строкового литерала в пямяти. ptrArr - не указатель. ptrArr - массив. ptrArr - массив из двух указателей типа char *. Каждый их этих char * указателей в массиве будет указывать на свой строковый литерал.hello и world - это указатели. Массив же объявлен как содержащий указатели-на-указатели. Налицо явное несоответствие типов.
2
|
|||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||
| 17.10.2016, 20:14 [ТС] | |||||
Почитаю ещё раз, спасибо за совет.Добавлено через 12 минут Когда объявляется массив, разве переменная которой он присваивается это не указатель на первый элемент?
0
|
|||||
|
|
|
| 17.10.2016, 20:21 | |
|
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 17.10.2016, 20:22 [ТС] | |
|
0
|
|
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
|
| 17.10.2016, 20:34 | |
|
1
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 17.10.2016, 20:48 [ТС] | ||
|
TheCalligrapher,
Спасибо. А звездочки после типа уже касаются каждого его элемента на первом уровне вложенности? Добавлено через 4 минуты Если переменная которой он присваивается не является указателем на первый элемент
0
|
||
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,217
|
|||||||
| 17.10.2016, 20:57 | |||||||
|
Если посмотреть на диагностические сообщения компилятора, то видно, что он просто видит его как
Если вы хотите, чтобы компилятор GCC вел себя как компилятор языка С, то необходимо указывать параметры -std=... и -pedantic-errors. Например, -std=c11 -pedantic-errors
2
|
|||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 17.10.2016, 21:07 [ТС] | |
|
TheCalligrapher,
Большое спасибо. Все понятно
0
|
|
|
|
||
| 17.10.2016, 21:31 | ||
Компилятору было объяснено, что некоторые пары символов, начинающихся с обратного слеша нужно интерпретировать специальным образом. \0 \t \n и т.д.
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 18.10.2016, 10:17 [ТС] | |
|
HighPredator,
Я не совсем про это ![]() Понятие "символ" из области кодировки, так? В литерале char *ptr = "hello"; может быть не hello, каждый символ которого 1 байт, а например, символ состоящий из двух или более байт. Но как видно кодировка в данном примере не применяется, соответственно компилятор насколько я понимаю ничего не знает о "символах" а работает со строкой как с потоком байт. В связи с этим не могу понять, как именно он определяет какой "символ" идет первым? Добавлено через 2 минуты Может просто имеется ввиду, что идет смещение на начало области памяти, на которое указывает char *ptr ?
0
|
|
| 18.10.2016, 10:17 | |
|
Помогаю со студенческими работами здесь
20
Почему на label11 выводится не правильный результат?
Результат выполнения цикла for и while не выводится на экран, почему? Как работать с элементами двумерного динамического массива через явное разыменования указателя?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|