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

Константный указатель на целое - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.69
Nekrofreeman
 Аватар для Nekrofreeman
4 / 4 / 0
Регистрация: 03.06.2012
Сообщений: 30
27.07.2012, 07:15     Константный указатель на целое #1
Начал осваивать С++ по книжке Страуструпа, одно из первых заданий: напишите описание константного указателя на целое. Как я это делаю:
C++
1
int *const dgt;
На что мне выдается ошибка которая подчеркивает точку с запятой и следующий текст: "Для константы переменная "dgt" требуется инициализатор"
Что я делаю не так? Пишу в MS Visual Studio 2010.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
27.07.2012, 07:31     Константный указатель на целое #2
Все верно, константный указатель нужно инициализировать при объявлении, например адресом другой переменной:

C++
1
2
int x;
int *const dgt = &x;
В дальнейшем указатель нельзя будет изменить. То есть написать что-то вроде

C++
1
dgt = &y;
уже не получится. Тут работает общее правило для всех констант, они должны быть проинициализированы и их значение нельзя изменить. Например:

C++
1
2
const int x = 100; // требуется инициализатор
x = 200; // ошибка, х - константа
dickivs
 Аватар для dickivs
46 / 46 / 6
Регистрация: 25.11.2011
Сообщений: 267
27.07.2012, 07:35     Константный указатель на целое #3
по-моему ты объязательно должен проинициализировать указатель, не инициализация является ошибкой!
типичный пример не инициализации:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
int main()
{
int x,y;
int *const ptr=&x; // ошибка, ptr - всегда указывает
                         // на одну и ту же ячейку памяти
   *ptr = 7;
    ptr = &y;
 
return 0;
}
Nekrofreeman
 Аватар для Nekrofreeman
4 / 4 / 0
Регистрация: 03.06.2012
Сообщений: 30
27.07.2012, 07:54  [ТС]     Константный указатель на целое #4
Ок, спасиб ребята.
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
27.07.2012, 08:12     Константный указатель на целое #5
dickivs
Почему же ошибка ?
C++
1
2
3
4
5
6
int i = 345;
 
const int *s = &i; //нету никакой ошибки
 
i = 23 //вот здесь уже ошибка
*s = 44 // И здесь
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
27.07.2012, 08:18     Константный указатель на целое #6
Цитата Сообщение от xADMIRALx Посмотреть сообщение
i = 23
Тут-то в чём ошибка кроме отсутствия точки запятой? И, кстати когда вы перенесли квалификатор const, то смысл выражения поменялся, это стал указатель на константные данные, а не константный указатель, как в изначальном примере.
Nekrofreeman
 Аватар для Nekrofreeman
4 / 4 / 0
Регистрация: 03.06.2012
Сообщений: 30
27.07.2012, 08:19  [ТС]     Константный указатель на целое #7
Хм... Взялся за следующее задание. "Напишите программу которая печатает размеры основных типов и типа указателя. Используйте sizeof".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Size of char" << sizeof(char) << endl;
    cout << "Size of int"  << sizeof(short int) << endl;
    cout << "Size of char" << sizeof(int) << endl;
    cout << "Size of long int" << sizeof(long int) << endl;
    cout << "Size of float" << sizeof(float) << endl;
    cout << "Size of double" << sizeof(double) << endl;
    cout << "Size of long double" << sizeof(long double) << endl;
    cout << "Size of signed int" << sizeof(signed int) << endl;
    cout << "Size of unsigned int" << sizeof(unsigned int) << endl;
    cout << "Size of char*" << sizeof(char*) << endl;
    cout << "Size of int*"  << sizeof(short int*) << endl;
    cout << "Size of char*" << sizeof(int*) << endl;
    cout << "Size of long int*" << sizeof(long int*) << endl;
    cout << "Size of float*" << sizeof(float*) << endl;
    cout << "Size of double*" << sizeof(double*) << endl;
    cout << "Size of long double*" << sizeof(long double*) << endl;
    cout << "Size of signed int*" << sizeof(signed int*) << endl;
    cout << "Size of unsigned int*" << sizeof(unsigned int*) << endl;
    return 0;
}
Написал вот такой код, он компилится открывает консольку с результатами, но она исчезает практически сразу, ничего не успеваю заметить, правильно отработало или нет. Решил всунуть в конец system("PAUSE"); вот так
C++
1
2
3
4
        ...
    system ( "PAUSE" );
    return 0;
}
и вдруг код перестал компилиться. Но тут произошло интересное, пока писал это сообщение, решил глянуть какую именно ошибку он там мне пишет, еще раз запустил компиляцию и все прекрасно и правильно заработало! Код не менял. Вот решил спросить почему system ( "PAUSE" ) так странно себя ведет? Может кто сталкивался. Так, мне на будущее.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2012, 08:22     Константный указатель на целое #8
Цитата Сообщение от xADMIRALx Посмотреть сообщение
dickivs
Почему же ошибка ?
xADMIRALx, это у него коментарий к 9 строке, сместилось немного. А у вас
i = 23 //вот здесь уже ошибка
это с чего вдруг?
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
27.07.2012, 08:25     Константный указатель на целое #9
Nekrofreeman, для system("pause") надо подключить:

C++
1
#include <cstdlib>
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2012, 08:28     Константный указатель на целое #10
Цитата Сообщение от Schizorb Посмотреть сообщение
Nekrofreeman, для system("pause") надо подключить:

C++
1
#include <cstdlib>
Не нужно. Раз у него работает. Достаточно #include <iostream>
Nekrofreeman
 Аватар для Nekrofreeman
4 / 4 / 0
Регистрация: 03.06.2012
Сообщений: 30
27.07.2012, 08:30  [ТС]     Константный указатель на целое #11
Цитата Сообщение от Schizorb Посмотреть сообщение
Nekrofreeman, для system("pause") надо подключить:

C++
1
#include <cstdlib>
хм.. на будущее учту, но однако сейчас код без этой библиотеки откомпилился и работал с system ( "PAUSE" )
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
27.07.2012, 08:31     Константный указатель на целое #12
alsav22

А ну если сместилось,то да )

Nekrofreeman
VS студия автоматом находит биболитеки
Nekrofreeman
 Аватар для Nekrofreeman
4 / 4 / 0
Регистрация: 03.06.2012
Сообщений: 30
27.07.2012, 08:35  [ТС]     Константный указатель на целое #13
Смышленая барышня)
Intel~lect
 Аватар для Intel~lect
135 / 124 / 2
Регистрация: 03.07.2012
Сообщений: 355
27.07.2012, 13:32     Константный указатель на целое #14
Цитата Сообщение от Nekrofreeman Посмотреть сообщение
и вдруг код перестал компилиться. Но тут произошло интересное, пока писал это сообщение, решил глянуть какую именно ошибку он там мне пишет, еще раз запустил компиляцию и все прекрасно и правильно заработало! Код не менял. Вот решил спросить почему system ( "PAUSE" ) так странно себя ведет?
Возможно это не system( "PAUSE" ) ведет себя странно а просто во время компиляции не открылся .EXE-файл для записи. У меня так иногда бывает. Правда не знаю из-за чего это происходит. И вот такая ошибка появляется в Code::Blocks:
"ld.exe||cannot open output file file.exe Permission denied".
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
27.07.2012, 14:25     Константный указатель на целое #15
Ничего студия автоматически не находит. Просто где то во вложениях в iostream используется заголовок, в котором имеется прототип system(). Но это не означает, что не нужно подключать библиотеку, так как это всего лишь реализация компилятора, а не какая то "фича". На другом компиляторе, даже другой версии студии, данный код может просто не скомпилироваться.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2012, 15:08     Константный указатель на целое #16
Цитата Сообщение от Toshkarik Посмотреть сообщение
На другом компиляторе, даже другой версии студии, данный код может просто не скомпилироваться.
mingv тоже обходится #include <iostream>
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2012, 15:17     Константный указатель на целое #17
Цитата Сообщение от alsav22 Посмотреть сообщение
mingv тоже обходится #include <iostream>
это не повод игнорировать эти хедеры!
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2012, 15:22     Константный указатель на целое #18
Цитата Сообщение от Jupiter Посмотреть сообщение
это не повод игнорировать эти хедеры!
А как узнать, какие хедеры необходимы? Обычно компилятор подсказывает, чего ему не хватает.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
27.07.2012, 15:27     Константный указатель на целое #19
В нормальных книгах пишут, в каких заголовочных файлах находятся прототипы нужных функций. Или читать стандарт.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2012, 17:45     Константный указатель на целое
Еще ссылки по теме:

C++ Можно ли утверждать, что в C++ имя функции - константный указатель на функцию ?
Константный метод и константный аргумент в методе C++
C++ Константный указатель на константные данные (указатели)

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2012, 17:45     Константный указатель на целое #20
Цитата Сообщение от alsav22 Посмотреть сообщение
А как узнать, какие хедеры необходимы?
cplusplus.com
cppreference.com
msdn
Yandex
Объявления
27.07.2012, 17:45     Константный указатель на целое
Ответ Создать тему
Опции темы

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