CPallini
Сравнение несправедливо: фрагменты кода не эквивалентны.
Вы должны сравнить либо
// snippet a.1
int *p;
p = 19;
cout << "p val"<< *p << endl;
cout << "p addr" << p << endl;
// snippet a.2
char *s;
s = 'a';
cout << "s val"<< *s << endl;
cout << "s addr" << s << endl;
Выходные данные компилятора:[...]: error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
p = 19;
^~
[...]: error: invalid conversion from ‘char’ to ‘char*’ [-fpermissive]
s = 'a';
^~~
или
// snippet b.1
const int ia[] = {1,2,3};
int *p;
p = ia;
cout << "p val"<< *p << endl;
cout << "p addr" << p << endl;
// shippet b.2
char *s;
s = "alpha";
cout << "s val"<< *s << endl;
cout << "s addr" << s << endl;
Выходные данные компилятора[...]: error: invalid conversion from ‘const int*’ to ‘int*’ [-fpermissive]
p = ia;
^~
[...]: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
s = "alpha";
^~~~~~~
В приведенном выше случае (фрагменты b) компилятор фактически рассматривает
char
как-то по-особенному (наверное, это и есть
C
наследие).
[обновление]
Цитата:
Но чего я не знаю, так это почему обычный целочисленный указатель не может указывать на целое число const.
Указатель
мочь например, укажите на целочисленную константу:
const int myconst = 10;
const int * p = &myconst; // p is a pointer to const (NOT a const pointer)
printf("Address = %p, value = %d\n", p, *p);
Однако вы не можете произвольно назначить ему адрес (как в вашем примере):
const int * p = 19; // ERROR
это явно неправильно.
Цитата:
Мое первое предположение заключается в том , что разрешение so позволит изменить значение const int через указатель
Это довольно правильно: вы можете назначить
адрес целого числа const только
указатель на целое число const (Не указатель const).
Цитата:
предположение втором это константный указатель должен использоваться, чтобы указать на переменную const
Нет.
- Указатель на целое число const должен использоваться для указания на целое число const.
- Указатель const-это указатель, значение которого (то есть адрес, на который он указывает) не может быть изменено.
Напр.
const int myconst = 10;
const int * p = &myconst; // p is pointer to const int
int i = 0;
int j = 0;
int * const q = &i; // q is a const pointer to int
*q = 50; // i.e. i=50, it is OK, since q points to a variable
q = &j; // ERROR, cannot change the address q points to
[/обновление]
out0FBox
Да. Сравнение отключено в моем примере вопроса.
Согласно фрагменту b.1, если массив не является целым числом cont, то ошибки быть не должно.
Но чего я не знаю, так это почему обычный целочисленный указатель не может указывать на целое число const.
Мое первое предположение заключается в том , что разрешение so позволит изменить значение const int с помощью указателя. Второе предположение состоит в том, что указатель const должен использоваться для указания на переменную const.
Дайте мне знать, если мои предположения верны.