Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 96
Завершенные тесты: 1
#1

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

11.04.2013, 19:02. Просмотров 747. Ответов 8
Метки нет (Все метки)

Здравия желаю!

Хотелось бы узнать, как можно работать с параметрами-указателями при работе функций вроде
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го элемента и копию указателя.

Просьба сказать, прав ли я в своих домыслах, а если не прав, то где именно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 19:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ипользование const с указателем, параметром функции (C++):

Сеттер с const параметром - C++
Добрый вечер, хотел уточнить: - для сложных типов void setSome(const MyType&amp; set) или void setSome(MyType&amp; set) (вызывать...

Модификатор const для параметра функции не const? - C++
void foo(const int N) { int Arr; //&lt;-- ??? } В clang это работает. В VisualStudio 2015 нет.

Const char несовместим с параметром типа FILE - C++
Привет всем. У меня возникла проблема. Пишу программу, связанную с файлами. Вот первый отрывочек проги. #include &lt;stdio.h&gt; int...

const& и const* в имени функции - C++
Объясните пожалуйста что значит const&amp; и const* в имени и параметрах функции(пример из Вандевурд,Джосаттис): template &lt;typename T&gt; ...

int const * const foo(const int* param) const - разъясните значение квалификаторов - C++
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ? 2: делает содержимое массива или...

Аргумент типа WCHAR* не совместим с параметром типа const char* - C++
Как исправить косяк? VS12 ругаетсЯ #include &lt;windows.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include...

8
stima
490 / 342 / 40
Регистрация: 22.03.2011
Сообщений: 1,095
Завершенные тесты: 2
11.04.2013, 19:08 #2
Все что слева от * относится к данным. Справа к указателю.
0
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 756
11.04.2013, 19:12 #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-объект на вход
1
TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 96
Завершенные тесты: 1
11.04.2013, 19:15  [ТС] #4
Это понятно. Мне надо понять: при const справа от *, значения pointer[1..n] менять можно?

Добавлено через 2 минуты
abit, то есть, чтобы создать абсолютно несгибаемый указатель нужно const char const *a
0
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 756
11.04.2013, 19:20 #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, не только первый
0
TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 96
Завершенные тесты: 1
11.04.2013, 19:26  [ТС] #6
abit, то есть запретить изменение элементов по адресу нельзя, только самого адреса?

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

Или можно с помощью const char* и char*... Именно они регулируют это?
ещё раз
const char* p - запрещает менять данные в массиве , а сам указатель p - сдвигать имеете право
char * const p - запрещает менять указатель p, а данные по (*p) - пожалуйста
const char * const p - запрещает и то и другое
1
TempuSFatumA
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 96
Завершенные тесты: 1
11.04.2013, 19:32  [ТС] #8
Цитата Сообщение от abit Посмотреть сообщение
ещё раз
const char* p - запрещает менять данные в массиве , а сам указатель p - сдвигать имеете право
char * const p - запрещает менять указатель p, а данные по (*p) - пожалуйста
const char * const p - запрещает и то и другое
Да есть же! Спасибочки, это то, что я и хотел узнать!
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
11.04.2013, 21:35 #9
Цитата Сообщение от TempuSFatumA Посмотреть сообщение
Во 2м - значения элементов массива можно менять, но не копию указателя.
Нет. http://www.cyberforum.ru/blogs/18334/blog87.html
1
11.04.2013, 21:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 21:35
Привет! Вот еще темы с ответами:

В чем разница между указателем и указателем на указатель? - C++
int x, *p, *q; x=10; p=&amp;x; q=p; cout&lt;&lt;*q; int x, *p, **q; x=10; p=&amp;x; q=&amp;p;

Работа с указателем из main в функции - C++
Всем доброе утро.) Делал задание по односвязным спискам и столкнулся с проблемкой. Передаю конец списка по указателю в функция и...

Работа с указателем на массив в функции (!!!) - C++
Я написал программу по сортировке строк из файла, который на жёстком, прога отлично работает, может показаться абсурдом, но я не понял вот...

Массив в функции со static указателем на него - C++
Здрасти, делаю задание на указатели из книги Хортона по Вижуал С++. Задачка: передать в функцию строку и чтобы функция запомнила строку. ...


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

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

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