1 |
const int * const* *const* * * x; |
1 2 3 4 5 |
int main() { int value = 100; //обычная переменная для взятия адреса int * const p = &value; //Указательная переменная зафиксировала сохранённый в себя адрес } |
1 2 3 4 5 6 7 8 |
int main() { int value = 100; //обычная переменная для взятия адреса int * const p = &value; //Указательная переменная зафиксировала сохранённый в себя адрес int y; p = &y; //Нельзя изменить указательную переменную } |
1 2 3 4 5 6 7 |
int main() { int y = 200; int const *p = &y; (*p) = 300; //Нельзя изменить косвенное значение "руками" указательной переменной } |
1 2 3 4 5 6 7 8 9 10 |
int main() { int a = 100; int const * const p = &a; //Запрет изменять и хранимый в указателе "p" адрес, //и значение в том адресе разыменованным указателем a++; //напряму значение можно менять (*p)++; //изменять разыменованным указателем нельзя p++; //переназначить адрес, хранимый в указательной переменной, нельзя } |
1 2 3 4 5 6 7 8 9 |
int main() { int a = 200; const int *p1 = &a; //Что есть что? int const *p2 = &a; //Как читается? const int *p3 = &a; //Что можно менять, что нельзя? int const * const p4 = &a; const int * const p5 = &a; } |
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 |
int main() { int a = 200; const int *p1 = &a; //p1 - указатель на int-константу, //разыменованным указателем значение изменять нельзя. //*p1 = 300; //Это будет ошибкой. int const *p2 = &a; //p2 - указатель на int-константу, //разыменованным указателем значение изменять нельзя. //*p2 = 300; //Это будет ошибкой. const int *p3 = &a; //p3 - указатель на int-константу, //разыменованным указателем значение изменять нельзя //*p3 = 300; //Это будет ошибкой. int const * const p4 = &a; //p4 - константный указатель на int-константу. //Нельзя записать в p4 никакие иные адреса, кроме сейчас записываемого. //разыменованным указателем значения изменять нельзя. int b = 100; // p4 = &b; //Это будет ошибкой. Нельзя изменить адрес внутри указательной переменной. //*p4 = 100; //Это будет ошибкой. Нельзя изменить значение разыменованным указателем. const int * const p5 = &a; //Попробуйте сами } |
1 2 3 4 5 6 7 8 |
int main() { int a = 200; int const * p = &a; //читайте справа налево, от имени указательной переменной a++; //Сама переменная легко изменяется (*p)++; //Но не разыменованным указателем } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//Borland C++3.1 Указатели и константы Листинг #1 #include <iostream.h> int main() { int a = 100; //Два обычных объекта типа int int b = 222; int *const P2 = &a; //Константный указатель {P2} указывает на переменную {a}, тип которой int. *P2 = 987; //Менять значение разрешено. //P2 = &b; //Но изменять адрес не разрешается. const int *P1 = &a; //Указатель на константу int. //*P1 = 110; //Менять значение нельзя. P1 = &b; //Но менять адрес разрешено. const int *const P3 = &a; //Константный указатель на константу int. //*P3=155; //Изменять нельзя ни значение, //P3=&b; //ни адрес, к которому такой указатель привязан. cin.get(); } } |
1 |
const int * const* *const* * * x; |
1 2 3 4 5 |
int main(){ const int * const* *const* * * x; x [0][0][0][0][0][0]; x [0][0][0][0][0][0][0]; //Работать как с более чем шестимерным массивом не выйдет } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
int main(){ //Любой многомерный массив - это ни что иное как массив массивов. //Имя массива умеет неявно приводиться к указателю на первый свой элемент. //В обычных условиях имя массива неподвижно: нельзя имени массива переназначить используемый адрес. //В случае использования указателей и констант можно получить необычную чехарду массивов: //часть массивов будут неподвижными массивами, //а часть сможет бегать по памяти. const int * const* *const* * * x; //Подобие шестимерного массива. x[0]++; //Неконстантные указатели сдвинуть можно x[0]--; //Константные указатели сдвинуть нельзя x[0][0][0]++; //Нельзя сдвинуть адрес x[0][0][0][0][0]++; //Нельзя сдвинуть адрес //Конечное значение не указательного типа x[0][0][0][0][0][0]++; //Нельзя изменить конечное значение } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int main(){ const int * const* *const* * * x; x++; //Неконстантные указатели сдвинуть можно x--; //Константные указатели сдвинуть нельзя ***(***x)++; //Нельзя сдвинуть адрес *(*****x)++; //Нельзя сдвинуть адрес //Конечное значение не указательного типа (******x)++; //Нельзя изменить конечное значение } |
Когда-то где-то вычитал (у Страуструпа может, не помню) чтобы легче читать код и определятся с синтаксисом при написании (запомнить в общем), нужно читать конструкцию справа налево:
const int* — указатель(*) на целую(int) константу(const)
int *const — константный(const) указатель(*) на целое(int)
как-то так 🙂
ресурсу и авторам +
«Каждый из трех описанных описанных вариантов » — 2 раза слово «описанных») не по теме с++, но все же (=
Значение константного указателя на константу можно изменить с помощью другого указателя
Ваш пример в упрощённом варианте выглядит так:
Разумеется, можно изменять переменную, которая не константная, используя указатель.
Чтобы её не изменять, например случайно, нужно использовать ту самую переменную, которая константный указатель на константу.
Маша какого хрена я этого не знаю.
дык в конце то указатель не на целое, а на константное целое
На неконстантное целое.
Здраствуйте.Посмотрите.Почему нельзя создать массив так?
Это компилируется, только размер массива будет неопределён, использование неицианилизорванных своими значениями переменных — есть непрогнозируемое поведение программы.
Поскольку в указатель, который используется для описания размера массива, не записано никакого значения, то по сути в указателе лежит только-лишь неопределённое значение, использование которого даёт непрогнозируемый эффект.
Порядок нарушен. Сначала надо задать любое значение в адрес, на который ссылается указатель. И только потом на основании этого значения делать массив, а не сначала делать массив, чтобы потом говорить ему о его размере. Поменяйте 9-ю и 10-ю строчки местами и всё будет ОК.