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

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

11.04.2013, 19:02. Просмотров 1550. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2013, 19:02
Ответы с готовыми решениями:

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

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

Const char несовместим с параметром типа FILE
Привет всем. У меня возникла проблема. Пишу программу, связанную с файлами. Вот первый отрывочек...

const& и const* в имени функции
Объясните пожалуйста что значит const&amp; и const* в имени и параметрах функции(пример из...

8
498 / 348 / 93
Регистрация: 22.03.2011
Сообщений: 1,108
11.04.2013, 19:08 2
Все что слева от * относится к данным. Справа к указателю.
0
276 / 275 / 83
Регистрация: 03.02.2013
Сообщений: 792
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
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 104
11.04.2013, 19:15  [ТС] 4
Это понятно. Мне надо понять: при const справа от *, значения pointer[1..n] менять можно?

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

Или можно с помощью const char* и char*... Именно они регулируют это?
0
276 / 275 / 83
Регистрация: 03.02.2013
Сообщений: 792
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
1 / 1 / 0
Регистрация: 02.04.2013
Сообщений: 104
11.04.2013, 19:32  [ТС] 8
Цитата Сообщение от abit Посмотреть сообщение
ещё раз
const char* p - запрещает менять данные в массиве , а сам указатель p - сдвигать имеете право
char * const p - запрещает менять указатель p, а данные по (*p) - пожалуйста
const char * const p - запрещает и то и другое
Да есть же! Спасибочки, это то, что я и хотел узнать!
0
go
Эксперт С++
3639 / 1371 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
11.04.2013, 21:35 9
Цитата Сообщение от TempuSFatumA Посмотреть сообщение
Во 2м - значения элементов массива можно менять, но не копию указателя.
Нет. https://www.cyberforum.ru/blogs/18334/blog87.html
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2013, 21:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Проблема с заданием шаблона метода с параметром const std::function<T()>
Доброго времени суток! Ткните пожалуйста носом, что не так с заданием шаблона? Компилятор ругается...

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

Аргумент типа const char* не совместим с параметром типа LPCWSTR
Делаю лабораторную ... Оконные приложения winapi по заданию - см.скрин2 При попытке собрать...

Аргумент типа const char* не совместим с параметром типа LPCWSTR
Начал учить win32 по книге Финогенова, вставил код первой проги в VS10, пишет мне ошибку &quot;аргумент...


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

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

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