Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 01.10.2022
Сообщений: 4

Проблема с указателями

04.08.2023, 19:02. Показов 1021. Ответов 12

Студворк — интернет-сервис помощи студентам
Здравствуйте при изучение указателей в СИ возникли трудности. Рассмотрим фрагмент программы:

C
1
2
3
char s[5] = {'В','А','С','Я','\0'};
char *p = s;
printf("%s",p);
Почему мы в последней строчке не пишем так: printf("%s",*p). То есть, разыменовываем указатель, где храниться первый элемент строки. Как понять с точки зрения машины последнюю строчку?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.08.2023, 19:02
Ответы с готовыми решениями:

Проблема с указателями.
Доброго времени суток. Такой вопрос: если имеется массив указателей на объекты, как удалить из i-ой ячейки указатель или занулить его? ...

Проблема с указателями!
Создать программу для решения задачи построения слова из некоторого множества букв (игра Scrabble) используя алгоритмы поиска в глубину и в...

проблема с указателями
struct magazin { int nomer; char nazvanie; char fio; int kol; double dohod; magazin *prev,*next; magazin *pt,*pg; } ...

12
2619 / 1630 / 266
Регистрация: 19.02.2010
Сообщений: 4,324
04.08.2023, 20:14
После разыменования будет char, т.е. единственный символ. А не строка.
Если разыменовывать - то надо и спецификатор формата поменять (чтобы символ напечатать): printf("%c",*p);
А при "%s" - нужен именно string pointer в качестве соответствующего аргумента.
1
0 / 0 / 0
Регистрация: 01.10.2022
Сообщений: 4
04.08.2023, 20:55  [ТС]
Понял, спасибо! А если тоже самое, но

C
1
2
3
char *a;
a = 'f';
printf("%c",a);
Почему компилятор такой вариант приеемлит и выводит вместо адреса символ f? ведь во второй строчке ожидается адрес, а мы туда символ кладем.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
04.08.2023, 21:42
Цитата Сообщение от OlegSSSS Посмотреть сообщение
Почему компилятор такой вариант приеемлит и выводит вместо адреса символ f?
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
[andrew@centandrew shitcode]$ gcc -Wall OlegSSS_pchar.c 
OlegSSS_pchar.c: In function ‘main’:
OlegSSS_pchar.c:5:7: warning: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
    5 |     a = 'f';
      |       ^
OlegSSS_pchar.c:6:14: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
    6 |     printf("%c",a);
      |             ~^  ~
      |              |  |
      |              |  char *
      |              int
      |             %s
[andrew@centandrew shitcode]$
А выводит потому, что значение 'f' вполне себе помещается в 32 (64) бита, выделенных для хранения адреса символа.
1
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,852
Записей в блоге: 15
05.08.2023, 13:24
Цитата Сообщение от OlegSSSS Посмотреть сообщение
Понял, спасибо! А если тоже самое, но
C
1
2
3
char *a;
a = 'f';
printf("%c",a);
У меня такой код не компилируется, выдает ошибку. А варнинг можно игнорить по сути
Кликните здесь для просмотра всего текста
Compiling single file...
--------
- Filename: D:\Docs\AspireM3400\Documents\C_codes\fo rum.c
- Compiler Name: TDM-GCC 4.9.2 64-bit Release

Processing C source file...
--------
- C Compiler: %BinDir0%\gcc.exe
- Command: gcc.exe "D:\Docs\AspireM3400\Documents\C_codes\f orum.c" -o "D:\Docs\AspireM3400\Documents\C_codes\f orum.exe" -I"%CppIncludeDir0%" -I"%CppIncludeDir1%" -I"%CppIncludeDir2%" -L"%LibDir0%" -L"%LibDir1%" -static-libgcc -Wfloat-equal -std=c11 -Wall -Wextra -pedantic-errors -s
D:\Docs\AspireM3400\Documents\C_codes\fo rum.c: In function 'main':

D:\Docs\AspireM3400\Documents\C_codes\fo rum.c:10:4: error: assignment makes pointer from integer without a cast
a = 'f';
^
D:\Docs\AspireM3400\Documents\C_codes\fo rum.c:11:2: warning: format '%c' expects argument of type 'int', but argument 2 has type 'char *' [-Wformat=]
printf("%c\n", a);
^


Compilation results...
--------
- Errors: 1
- Warnings: 1
- Output Filename: D:\Docs\AspireM3400\Documents\C_codes\fo rum.exe
- Output Size: 15,5 KiB
- Compilation Time: 0,09s
0
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
05.08.2023, 14:59
мама Стифлера, видимо потому что у вас установлена опция компилятора -pedantic-errors
1
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,852
Записей в блоге: 15
05.08.2023, 16:51
woldemas, да, было из-за этого. Тем не менее, с двойными кавычками и разыминовыванием код компилируется и работает
C
1
2
3
char *a;
a = "f";
printf("%c", *a);
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
06.08.2023, 06:08
Цитата Сообщение от мама Стифлера Посмотреть сообщение
А варнинг можно игнорить по сути
Крайне неудачная затея предупреждения игнорировать. Вот человек ждал, что ему адрес выведется, а получился символ. Удивляется. А включил бы предупреждения, да прочитал бы повнимательнее, глядишь - во всём бы сам и разобрался. И это, замечу, один из самых лёгких случаев. Вопрос, как будет работать сравнительно большая программа, если при компиляции на предупреждения забивать? В лучшем случае просто не запустится!
1
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,852
Записей в блоге: 15
06.08.2023, 06:25
easybudda, согласен, что нужно смотреть все варнинги. Но просто есть не значительные, на которые можно закрыть глаза
Тем не менее, для себя специально прописал опции компилятора, чтоб показывало варнинги и стараюсь, чтоб их не было совсем.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
07.08.2023, 16:53
Лучший ответ Сообщение было отмечено OlegSSSS как решение

Решение

Цитата Сообщение от OlegSSSS Посмотреть сообщение
Почему мы в последней строчке не пишем так: printf("%s",*p). То есть, разыменовываем указатель, где храниться первый элемент строки.
Потому что в описании спецификатора формата %s открытым текстом написано, что он хочет именно указатель на первый элемент строки. Он не хочет первый элемент строки, он хочет указатель на первый элемент строки.

Откуда вообще мог возникнуть такой вопрос? Формат %s должен выводить всю строку. Как он будет это делать, если вы будете передавать ему только первый элемент строки?

Цитата Сообщение от мама Стифлера Посмотреть сообщение
У меня такой код не компилируется, выдает ошибку.
Такой код ни у кого не компилируется. char *a; a = 'f'; в С скомпилировать невозможно. А какое там диагностическое сообщение в ответ на это выдал компилятор - это уже дело десятое.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
07.08.2023, 17:14
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Такой код ни у кого не компилируется.
Да нет. Вот код:
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void) {
    char *a;
    a = 'f';
    printf("%c",a);
    
    return 0;
}
вот компилируется и даже буковку выводит:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[andrew@centandrew shitcode]$ gcc -Wall -o gcc.out OlegSSS_pchar.c 
OlegSSS_pchar.c: In function ‘main’:
OlegSSS_pchar.c:5:7: warning: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
    5 |     a = 'f';
      |       ^
OlegSSS_pchar.c:6:14: warning: format ‘%c’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=]
    6 |     printf("%c",a);
      |             ~^  ~
      |              |  |
      |              |  char *
      |              int
      |             %s
[andrew@centandrew shitcode]$ ./gcc.out 
f[andrew@centandrew shitcode]$ 
[andrew@centandrew shitcode]$ clang -Wall -o clang.out OlegSSS_pchar.c 
OlegSSS_pchar.c:5:7: warning: incompatible integer to pointer conversion
      assigning to 'char *' from 'int' [-Wint-conversion]
    a = 'f';
      ^ ~~~
OlegSSS_pchar.c:6:17: warning: format specifies type 'int' but the argument has
      type 'char *' [-Wformat]
    printf("%c",a);
            ~~  ^
            %s
2 warnings generated.
[andrew@centandrew shitcode]$ ./clang.out 
f[andrew@centandrew shitcode]$ 
[andrew@centandrew shitcode]$ gcc --version
gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
[andrew@centandrew shitcode]$ clang --version
clang version 3.4.2 (tags/RELEASE_34/dot2-final)
Target: x86_64-redhat-linux-gnu
Thread model: posix
[andrew@centandrew shitcode]$
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
07.08.2023, 17:20
Цитата Сообщение от easybudda Посмотреть сообщение
вот компилируется
Это - не компилируется. Компилятор выдал требуемое спецификацией языка диагностическое сообщение - значит код не компилируется. Конец истории.

А всякое "буковку выводит" - это просто компилятор забыл за собой мусор почистить поле неудачной компиляции, а вы его зачем-то взялись запускать...
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
07.08.2023, 17:41
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это - не компилируется.
"компилируется" - это когда исходный код транслируется в исполняемый файл. На выходе получается файл, который можно запустить на выполнение и даже получить ожидаемый (в данном случае) результат. А вот почему исходный код неправильный, сказано в сообщениях компилятора.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Компилятор выдал требуемое спецификацией языка диагностическое сообщение - значит код не компилируется.
По этой логике чуть меньше, чем все порты во FreeBSD "не собираются".
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А всякое "буковку выводит" - это просто компилятор забыл за собой мусор почистить поле неудачной компиляции
А это компилятор "буковку выводит"? Или всё-таки собранная им из кривого кода программа?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2023, 17:41
Помогаю со студенческими работами здесь

Проблема с указателями
В 64 строке две ошибки связанные с указателем,никак не могу решить. #include &quot;pch.h&quot; #include &lt;stdio.h&gt; #include...

Проблема с указателями
Привет! Есть такой калькулятор: #include &lt;stdio.h&gt; #include &quot;string2.h&quot; ///////////////////////////////////////////////// int...

Проблема с указателями
Пушу вроде бы все правильно но вот беда. но вот беда, он жалуется на вывод десятичных знаков, а если их убрать выдает ошибку &quot;Ошибка...

Проблема с указателями
Есть задание : Объявить массив целых чисел и заполнить его случайными значениями. Размер массива 50, диапазон значений от -50 до 50.Найти...

Проблема с указателями
Может ли мне кто-нибудь объяснить, почему функция swap не меняет адреса указателей? template&lt;typename T&gt; void swap(T* left, T*...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru