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

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

27.07.2012, 07:15. Просмотров 5680. Ответов 19
Метки нет (Все метки)

Начал осваивать С++ по книжке Страуструпа, одно из первых заданий: напишите описание константного указателя на целое. Как я это делаю:
C++
1
int *const dgt;
На что мне выдается ошибка которая подчеркивает точку с запятой и следующий текст: "Для константы переменная "dgt" требуется инициализатор"
Что я делаю не так? Пишу в MS Visual Studio 2010.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2012, 07:15
Ответы с готовыми решениями:

Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать?
Подскажите, что значит константный указатель на объект, указатель на константный объект, и как это...

Константный указатель или указатель на константу?
Привет всем.Уважаемые программисты пожалуйста скажите чем отличать когда написано например int...

Константный указатель
Здравствуйте! Имею класс - MyClass. Константный указатель на него: const MyClass *pMyClass; ...

Константный указатель
Для записи через * T * const name; Для записи через ???

19
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 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; // ошибка, х - константа
2
47 / 47 / 11
Регистрация: 25.11.2011
Сообщений: 275
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;
}
1
7 / 7 / 0
Регистрация: 03.06.2012
Сообщений: 30
27.07.2012, 07:54  [ТС] 4
Ок, спасиб ребята.
0
69 / 63 / 5
Регистрация: 09.06.2012
Сообщений: 291
27.07.2012, 08:12 5
****ivs
Почему же ошибка ?
C++
1
2
3
4
5
6
int i = 345;
 
const int *s = &i; //нету никакой ошибки
 
i = 23 //вот здесь уже ошибка
*s = 44 // И здесь
1
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
27.07.2012, 08:18 6
Цитата Сообщение от xADMIRALx Посмотреть сообщение
i = 23
Тут-то в чём ошибка кроме отсутствия точки запятой? И, кстати когда вы перенесли квалификатор const, то смысл выражения поменялся, это стал указатель на константные данные, а не константный указатель, как в изначальном примере.
0
7 / 7 / 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" ) так странно себя ведет? Может кто сталкивался. Так, мне на будущее.
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2012, 08:22 8
Цитата Сообщение от xADMIRALx Посмотреть сообщение
****ivs
Почему же ошибка ?
xADMIRALx, это у него коментарий к 9 строке, сместилось немного. А у вас
i = 23 //вот здесь уже ошибка
это с чего вдруг?
0
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
27.07.2012, 08:25 9
Nekrofreeman, для system("pause") надо подключить:

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

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

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

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

Nekrofreeman
VS студия автоматом находит биболитеки
1
7 / 7 / 0
Регистрация: 03.06.2012
Сообщений: 30
27.07.2012, 08:35  [ТС] 13
Смышленая барышня)
0
137 / 126 / 14
Регистрация: 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".
0
1172 / 885 / 94
Регистрация: 03.08.2011
Сообщений: 2,455
27.07.2012, 14:25 15
Ничего студия автоматически не находит. Просто где то во вложениях в iostream используется заголовок, в котором имеется прототип system(). Но это не означает, что не нужно подключать библиотеку, так как это всего лишь реализация компилятора, а не какая то "фича". На другом компиляторе, даже другой версии студии, данный код может просто не скомпилироваться.
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2012, 15:08 16
Цитата Сообщение от Toshkarik Посмотреть сообщение
На другом компиляторе, даже другой версии студии, данный код может просто не скомпилироваться.
mingv тоже обходится #include <iostream>
0
Каратель
Эксперт С++
6593 / 4014 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.07.2012, 15:17 17
Цитата Сообщение от alsav22 Посмотреть сообщение
mingv тоже обходится #include <iostream>
это не повод игнорировать эти хедеры!
0
5473 / 4868 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.07.2012, 15:22 18
Цитата Сообщение от Jupiter Посмотреть сообщение
это не повод игнорировать эти хедеры!
А как узнать, какие хедеры необходимы? Обычно компилятор подсказывает, чего ему не хватает.
0
1172 / 885 / 94
Регистрация: 03.08.2011
Сообщений: 2,455
27.07.2012, 15:27 19
В нормальных книгах пишут, в каких заголовочных файлах находятся прототипы нужных функций. Или читать стандарт.
0
Каратель
Эксперт С++
6593 / 4014 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.07.2012, 17:45 20
Цитата Сообщение от alsav22 Посмотреть сообщение
А как узнать, какие хедеры необходимы?
cplusplus.com
cppreference.com
msdn
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2012, 17:45

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

Константный указатель
Почему в данном примере константный указатель может быть использован для вывода элементов вектора?...

Константный метод и указатель this
class CBox { double Length; double Height; double Width; public: CBox(double a,...

Константная переменная и константный указатель
В чем разница : int const а; const int a; С указателями такое видел, с переменными нет.

Неконстантный указатель на константный объект
Добрый день, объясните пожалуйста, вот это: const int ival = 1024; int *const &amp;piref = &amp;ival; ...


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

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

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