Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 15.01.2019
Сообщений: 8

Указатель на константную строку и имя массива как указатель

09.08.2019, 16:48. Показов 1389. Ответов 2

Студворк — интернет-сервис помощи студентам
Изучаю C. У меня есть указатель на константную строку, и я хочу его изменить путем передачи в функцию. Это работает без проблем:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    
#include <stdio.h>
 
void incriment(char**);
 
main()
{
      
      char *word = "Hello world!";
    
      printf("%s\n", word);// Hello world!
      incriment(&word);
      printf("%s\n", word);// ello world!
}
 
void incriment(char **p)
{   
    ++(*p);
}
Однако если я вместо указателя объявлю массив, то почему-то при попытке сместить указатель, который является именем массива, первый его элемент увеличится на 1:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    
#include <stdio.h>
 
void incriment(char**);
 
main()
{
      
      char word[] = "Hello world!";
    
      printf("%s\n", word);// Hello world!
      incriment(&word);
      printf("%s\n", word);// Iello world!
}
 
void incriment(char **p)
{   
    ++(*p);
}
Я знаю, что имя массива нельзя менять с помощью арифметики указателей - если сделать это явно в main, то будет ошибка компиляции. Почему этот код работает именно так, будто я хотел изменить символ? Я ожидал, что программа выдаст ошибку.

Теперь я хочу изменить букву в массиве символов, передав указатель на массив - знаю, что это излишне. Но происходит ошибка при попытке увеличить букву на 1 таким способом:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    
#include <stdio.h>
 
void incriment(char**);
 
main()
{
      
      char word[] = "Hello world!";
    
      printf("%s\n", word);// Hello world!
      incriment(&word);
      printf("%s\n", word);// Iello world!
}
 
void incriment(char **p)
{   
    ++(**p);// Ошибка: нарушение прав доступа при чтении по адресу...
}
Если при же я уберу одну * в функции (как в листинге 2), то можно будет передавать массив либо его адрес - одинаково сработают оба варианта. Почему так происходит?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    
#include <stdio.h>
 
void incriment(char**);
 
main()
{
      
      char *word = "Hello world!";
    
      printf("%s\n", word);// Hello world!
      incriment(word);// Не имеет значения, передать word или &word, результат один и тот же (остальной код при этом не меняю)
      printf("%s\n", word);// Iello world!
}
 
void incriment(char **p)
{   
    ++(*p);
}
Подскажите, пожалуйста, где я ошибся. Можно кинуть ссылку на статью по этой проблеме (самому загуглить не получилось).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.08.2019, 16:48
Ответы с готовыми решениями:

Указатель на константную текстовую строку
С точки зрения стандарта это валидный код? int main() { char* pproverb{ &quot;A miss is as good as a mile.&quot; }; return 0; ...

Как правильно кастовать указатель на константную ф-ю
Здравствуйте. Вот рабочий пример: #include &lt;iostream&gt; struct foo { void f(int a, int b) { std::cout &lt;&lt; &quot;foo(int, int)...

Имя массива как указатель
Выполните программу на С++: Используя имя массива как указатель, и применяя адресную арифметику выполнить задание. 3. Дан одномерный...

2
Заблокирован
09.08.2019, 16:53
C
1
2
3
4
5
6
7
main()
{
      char word[] = "Hello world!";
      char *p=word;  
      printf("%s\n", word);// Hello world!
      incriment(&p);
      printf("%s\n", p);
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.08.2019, 18:12
Цитата Сообщение от Maksim21 Посмотреть сообщение
C++
1
char word[] = "Hello world!";
Это массив char с нулём в конце - сишная смесь бульдога с носорогом фирменная технология. В блоге Evg очень классно рассказано о нюансах инициализации массивов и указателей char (и не только это, там ного о чём можно почитать с пользой).
Важно то что это массив. Просто (почти "просто" если бы не терминатор в конце) массив. Однако
Цитата Сообщение от Maksim21 Посмотреть сообщение
C++
1
char *word = "Hello world!";
это некорректная (deprecated или даже error в зависимости от стандарта и ключей компиляции) запись объявления указателя на с-строку - константу статического класса хранения, инициализированного литералом.
Различие в константности наиболее существенно для вашего случая. Остальное логично.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2019, 18:12
Помогаю со студенческими работами здесь

Имя массива как указатель
Используя имя массива как указатель, и применяя адресную арифметику выполнить задание (каждое задание оформить отдельной функцией). Дан...

Имя массива как указатель
Здравствуйте друзья. Подскажите как изменить код чтобы имя массива был как указатель. Заранее спасибо. #include &lt;iostream&gt; ...

Имя массива как указатель
Помогите с программой пожалуйста!! Конец года, горю.. Используя имя массива как указатель, и применяя адресную арифметику выполнить...

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Указатели и ссылки. Имя массива как указатель
7. Дан одномерный массив, состоящий из N целочисленных элементов. 7.1. Ввести массив с клавиатуры. 7.2. Найти минимальный положительный...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Настройка записи справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru