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

Вопросы по С++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
ElvenDragon
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
08.08.2011, 16:42     Вопросы по С++ #1
1) Чем отличается const *char от сhar при использовании в программах?
2) Тип void * так и не понял как и что с ним делать. Видел в функциях в качестве возвращаемого значения зачем он там нужен?
3) Зачем при создании структуры использовать впереди typedef? Типа такого typedef struct klon {};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2011, 16:42     Вопросы по С++
Посмотрите здесь:

C++ Вопросы
C++ Вопросы
C++ Вопросы по C++
C++ Ответы на вопросы
Вопросы по строкам C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.08.2011, 16:45     Вопросы по С++ #2
ElvenDragon,
1) Константный указатель и символ сравнивать... эээ?
2) void* - указатель в который гарантировано поместится указатель на любой тип. Работать напрямую с ним нельзя - только приводить к другому типу и работать как с указателем на конкретный тип.
3) Используется обычно в Си. Дабы не писать при объявлении struct klon - пишут просто klon.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct info
{
    int value;
};
 
info val; // ошибка
struct info val; // окей.
 
typedef struct
{
    int value;
} info;
 
info val; //окей
LosAngeles
Заблокирован
08.08.2011, 17:13     Вопросы по С++ #3
вроде если конст стоит слева от * то указатель на константу, а если справа - константный указатель?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.08.2011, 17:22     Вопросы по С++ #4
C
1
2
const char* // указатель на константу
char const* //константный указатель
ElvenDragon
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
08.08.2011, 17:25  [ТС]     Вопросы по С++ #5
Цитата Сообщение от Maxwe11 Посмотреть сообщение
C
1
2
const char* // указатель на константу
char const* //константный указатель
LosAngeles
Заблокирован
08.08.2011, 17:36     Вопросы по С++ #6
Цитата Сообщение от Maxwe11 Посмотреть сообщение
C
1
2
const char* // указатель на константу
char const* //константный указатель
а не так?
C
1
2
const char* // указатель на константу
char* const //константный указатель
Добавлено через 1 минуту
пример разбери
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    int i = 90;
    int j = 80;
    int const* pi = &i;
    int* const ip = &i;
 
    pi = &j;
    ip = &j;
 
    pi[0] = 45;
    ip[0] = 87;
    
    return 0;
}


Добавлено через 49 секунд
правильный ответ такой)
Цитата Сообщение от Maxwe11 Посмотреть сообщение
const char* // указатель на константу
char const* // указатель на константу
ElvenDragon
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
08.08.2011, 17:38  [ТС]     Вопросы по С++ #7
1) Чем отличается const *char от сhar* при использовании в программах? Я звездочку забыл указать.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.08.2011, 17:38     Вопросы по С++ #8
Цитата Сообщение от LosAngeles Посмотреть сообщение
а не так?
верно)
Сыроежка
Заблокирован
08.08.2011, 17:43     Вопросы по С++ #9
Цитата Сообщение от Maxwe11 Посмотреть сообщение
C
1
2
const char* // указатель на константу
char const* //константный указатель
У вас в обоих сллучаях объявлен указатель на константу. Чтобы указать константный указатель, следует писать

C++
1
char * const p;
А чтобы записать константный указатель на константу, следует писать

C++
1
const char * const p;
Добавлено через 3 минуты
Цитата Сообщение от ElvenDragon Посмотреть сообщение
1) Чем отличается const *char от сhar* при использовании в программах? Я звездочку забыл указать.
const char * означает\. что с поиощью этого указателя нельзя менять данные, на которые он указывает. То есть такое объявление означает, что данные, на которые указывает указатель, евляются константными, не подлежащими изменению.
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
08.08.2011, 18:20     Вопросы по С++ #10
Постараюсь пояснить по указателям и const.
Указатели и спецификаторы const. Рассмотрим несколько видов:
- указатели на константу.
- константные указатели.
- константные указатели на константу.
Указатели на константу.
1) Здесь cptr указатель на объект типа const double и спецификатор const относится именно к типу объекта, на который указывает cptr, а не к самому указатели cptr непосредственно
C++
1
const double *cptr; //cptr может указывать на переменную типа double, которая является константой
C++
1
2
3
const double pi = 3.14;
double *ptr = π //ошибка, так как ptr обычный указатель
const double *cptr = π //все правильно, так как cptr - указатель на константу
2) Для хранения константного объекта нельзя использовать указатель типа void, вместо него следует использовать тип const void, который способен содержать адрес константного объекта.

C++
1
2
3
const int universe = 42;
const void *cpv = &universe; //все правильно, так как cpv является указателем константу
void *pv = &universe; //ошибка, так как universe константа
3) Указателю на константный объект м. б. присвоен адрес не константного объекта.
C++
1
2
3
const double *cptr;
double dval = 3.14;
cptr = &dval; //такой вариант прокатит, но изменить значение dval с помощью cptr нельзя
4) В продолжении предыдущего примера - есть такой хитрый вариант:
C++
1
2
3
4
5
6
...
dval = 3.1415; //неконстанта, переменная типа double
*cptr = 3.1415; //ошибка, cptr - указатель на константу.
double *ptr = &dval; //ptr указывает на не константный объект, переменную типа double
*ptr = 2.72; //все прокатит, так как ptr является обычным указателем на не константный объект, переменную типа double
cout << *cptr; //напечатет 2.72
Для указателя cptr не имеет значения, является ли объект, на который он указывает, константой или нет. Важно помнить, что нет никакой гарантии, неизменности объекта, адрес которого хранит указатель на константу. Указатели на константу имеет смысл рассматривать как указатели, которые "полагают", что указывают на константу.

Константные указатели.
1) Подобно любым другим константам, изменить значение константного указателя нельзя, т.е. ему нельзя присвоить адрес другого объекта.
C++
1
2
3
int ix = 0;
int *const ptrc = &ix; //ptrc - константный указатель, который следует инициализировать при создании
ptrc = ptrc; //ошибка! Так как ptrc - константный указатель, ему нельзя уже ничего присвоить!
2) Константный указатель можно использовать для изменения значения, на которое он указывает.
C++
1
2
3
4
5
int ix = 0;
int *const ptrc = &ix;
cout << ix << endl; //напечатает 0
*ptrc = 42;
cout << ix << endl; //напечатает 42
Константные указатели на константу.

1)
C++
1
2
const double pi = 3.1415;
const double *const pi_ptr = &pi; //константный указатель на константный объект
Тут не м. б. изменены ни адрес, который хранит указатель pi_ptr, ни значение объекта ( константы pi ), на который он указывает.

Использованные источники:
Стенли Липпман "Язык программирования C++ вводный курс" 4 изд.
google.ru
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
08.08.2011, 18:35     Вопросы по С++ #11
Цитата Сообщение от Roof Посмотреть сообщение
4) В продолжении предыдущего примера - есть такой хитрый вариант:
C++
1
2
3
4
5
6
...
dval = 3.1415; //неконстанта, переменная типа double
*cptr = 3.1415; //ошибка, cptr - указатель на константу.
double *ptr = &dval; //ptr указывает на не константный объект, переменную типа double
*ptr = 2.72; //все прокатит, так как ptr является обычным указателем на не константный объект, переменную типа double
cout << *cptr; //напечатет 2.72
оО и что здесь хитрого?
хитрый это будет вот это.
C++
1
2
3
4
5
6
const double *cptr;
    double dval = 3.14;
    cptr = &dval;
    dval = 3.1415; //неконстанта, переменная типа double
    (double)*cptr = 2.72; //ошибки нет, явное привидение типов.
    cout << *cptr; //напечатет 2.72
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
08.08.2011, 18:38     Вопросы по С++ #12
хитрым назвал только для того чтобы акцентировать внимание на то, что нет гарантии неизменности объекта, на который указывает указатель на константу.
Да и в приведении типов нет ничего хитрого.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2011, 19:09     Вопросы по С++
Еще ссылки по теме:

C++ программирование вопросы
C++ Вопросы по C++
Вопросы по C++ C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
08.08.2011, 19:09     Вопросы по С++ #13
Цитата Сообщение от ElvenDragon Посмотреть сообщение
1) Чем отличается const *char от сhar* при использовании в программах? Я звездочку забыл указать.
Тем что указателей типа const *char - не бывает!
Yandex
Объявления
08.08.2011, 19:09     Вопросы по С++
Ответ Создать тему
Опции темы

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