Форум программистов, компьютерный форум CyberForum.ru

Ипользование const с указателем, параметром функции - C++

Восстановить пароль Регистрация
 
TempuSFatumA
 Аватар для TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 87
11.04.2013, 19:02     Ипользование const с указателем, параметром функции #1
Здравия желаю!

Хотелось бы узнать, как можно работать с параметрами-указателями при работе функций вроде
C++
1
2
3
4
void f1(char *c){cout<<c;}
void f2(const char *c){cout<<c;}
void f3(char * const c){cout<<c;}
void f4(const char * const c){cout<<c;}
Если я не ошибаюсь, в 1 случае копию указателя из вызывающего метода и значения элементов массива можно изменять по своему усмотрению(предусмотрев освобождение памяти, конечно же).
Во 2м - значения элементов массива можно менять, но не копию указателя.
В 3м - Нельзя менять значение 1го элемента, но можно копию указателя(опять-таки предусмотрев освобождение памяти).
В 4м - Нельзя менять значение 1го элемента и копию указателя.

Просьба сказать, прав ли я в своих домыслах, а если не прав, то где именно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 928
Завершенные тесты: 1
11.04.2013, 19:08     Ипользование const с указателем, параметром функции #2
Все что слева от * относится к данным. Справа к указателю.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
11.04.2013, 19:12     Ипользование const с указателем, параметром функции #3
Во 2м - значения элементов массива можно менять, но не копию указателя.
точно нет

C++
1
const char *c
здесь const относится к char а не к указателю, это говорит, что вы не можете использовать указатель с для изменения данных - он указывает на элементы типа const char

однако заметьте, что по стандарту функция с сигнатурой
C++
1
void f2(const char *c)
может принимать как const-объекты, так и не const-объекты

а
C++
1
void f2(char *c)
не может принимать const-объект на вход
TempuSFatumA
 Аватар для TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 87
11.04.2013, 19:15  [ТС]     Ипользование const с указателем, параметром функции #4
Это понятно. Мне надо понять: при const справа от *, значения pointer[1..n] менять можно?

Добавлено через 2 минуты
abit, то есть, чтобы создать абсолютно несгибаемый указатель нужно const char const *a
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
11.04.2013, 19:20     Ипользование const с указателем, параметром функции #5
Цитата Сообщение от TempuSFatumA Посмотреть сообщение
Это понятно. Мне надо понять: при const справа от *, значения pointer[1..n] менять можно?

Добавлено через 2 минуты
abit, то есть, чтобы создать абсолютно несгибаемый указатель нужно const char const *a
1) ваш код
C++
1
 void f3(char * const c)
позволяет менять элементы, но не позволяет изменять указатель
тут const относится к c, а тип данных просто - char *
2) не const char const *a а, вы правильно написали:

C++
1
void f4(const char * const c){cout<<c;}
здесь const-указатель на const char *
но даже в таком случае я бы не сказал что он совсем не сгибаемый, можно кастануть const_cast<char*> и уже на вашей совести будет

если же вы по поводу 1-го не первого элемента - они все будут не изменны в const char * c, не только первый
TempuSFatumA
 Аватар для TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 87
11.04.2013, 19:26  [ТС]     Ипользование const с указателем, параметром функции #6
abit, то есть запретить изменение элементов по адресу нельзя, только самого адреса?

Или можно с помощью const char* и char*... Именно они регулируют это?
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
11.04.2013, 19:29     Ипользование const с указателем, параметром функции #7
Цитата Сообщение от TempuSFatumA Посмотреть сообщение
abit, то есть запретить изменение элементов по адресу нельзя, только самого адреса?

Или можно с помощью const char* и char*... Именно они регулируют это?
ещё раз
const char* p - запрещает менять данные в массиве , а сам указатель p - сдвигать имеете право
char * const p - запрещает менять указатель p, а данные по (*p) - пожалуйста
const char * const p - запрещает и то и другое
TempuSFatumA
 Аватар для TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 87
11.04.2013, 19:32  [ТС]     Ипользование const с указателем, параметром функции #8
Цитата Сообщение от abit Посмотреть сообщение
ещё раз
const char* p - запрещает менять данные в массиве , а сам указатель p - сдвигать имеете право
char * const p - запрещает менять указатель p, а данные по (*p) - пожалуйста
const char * const p - запрещает и то и другое
Да есть же! Спасибочки, это то, что я и хотел узнать!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 21:35     Ипользование const с указателем, параметром функции
Еще ссылки по теме:

Аргумент типа WCHAR* не совместим с параметром типа const char* C++
C++ Массив в функции со static указателем на него
C++ Работа с указателем из main в функции

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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
11.04.2013, 21:35     Ипользование const с указателем, параметром функции #9
Цитата Сообщение от TempuSFatumA Посмотреть сообщение
Во 2м - значения элементов массива можно менять, но не копию указателя.
Нет. http://www.cyberforum.ru/blogs/18334/blog87.html
Yandex
Объявления
11.04.2013, 21:35     Ипользование const с указателем, параметром функции
Ответ Создать тему
Опции темы

Текущее время: 05:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru