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

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

09.08.2019, 16:48. Показов 1393. Ответов 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 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru