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

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

09.08.2019, 16:48. Показов 742. Ответов 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2019, 16:48
Ответы с готовыми решениями:

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

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

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

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

2
359 / 226 / 120
Регистрация: 25.06.2019
Сообщений: 830
09.08.2019, 16:53 2
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
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,276
Записей в блоге: 16
09.08.2019, 18:12 3
Цитата Сообщение от Maksim21 Посмотреть сообщение
C++
1
char word[] = "Hello world!";
Это массив char с нулём в конце - сишная смесь бульдога с носорогом фирменная технология. В блоге Evg очень классно рассказано о нюансах инициализации массивов и указателей char (и не только это, там ного о чём можно почитать с пользой).
Важно то что это массив. Просто (почти "просто" если бы не терминатор в конце) массив. Однако
Цитата Сообщение от Maksim21 Посмотреть сообщение
C++
1
char *word = "Hello world!";
это некорректная (deprecated или даже error в зависимости от стандарта и ключей компиляции) запись объявления указателя на с-строку - константу статического класса хранения, инициализированного литералом.
Различие в константности наиболее существенно для вашего случая. Остальное логично.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2019, 18:12

Имя массива как указатель
Здравствуйте друзья. Подскажите как изменить код чтобы имя массива был как указатель. Заранее...

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.