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

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

09.08.2019, 16:48. Показов 1346. Ответов 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
9005 / 4706 / 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
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru