И вообще тип указателя всегда - указатель. И не важно какие данные хранятся. Разве нет?
отлично компилируется. Хотя это-то понятно, если вы хотите выйте за границу массива - разве дело какого-то компилятора вам это запрещать?
Указатель.
Все эти фокусы типа написать в типе параметра char a[1]
или char a[10]
важны только во время компиляции - типа sizeof
взять. В исполняемом коде не будет никакой разницы - передаётся указатель.
Вообще, чтобы понимать, что между массивами и указателями нет никакой магии, вот Вам дословная цитата из п. 8.2.1 стандарта (выделение моё):
The expression E1[E2 ] is identical (by definition) to *( ( E1 ) +( E2) )
не всегда
О чем я и говорил
Не понимаю, давай пример когда указатель - это строка?
ну ты же не будешь спорить, что указатель на байт и на инт имеют разные типы? сам указатель это не более чем адрес в памяти, однако компилятор создает табличку, где хранит типы переменных, размещенных по этим адресам.
Иначе он не смог бы выполнять индексирование массивов.
Не буду спорить. Тип указателя всегда один. Будь то инт, массив из интов, строка или чего ещё.
Но тут он оперирует не указателем, а типом данных которые хранятся по данному адресу. Это разные вещи, так то.
Создай указатель на переменную типа char, присвой переменной значение, потом создай пустой указатель типа инт и присвой ему указатель (то есть адрес) первой переменной . Выведи на печать.
ага
char aa[] = "Hello";
int* b= aa;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println(*b);
}
Compiler output:
Arduino: 1.8.19 (Linux), Board: "Arduino Nano, ATmega328P"
sketch_nov17a:2:9: error: cannot convert 'char*' to 'int*' in initialization
int* b= aa;
^~
exit status 1
cannot convert 'char*' to 'int*' in initialization
Компилятор с тобой не согласен и считает char* и int* разными типами указателя.
Поговорим дальше или сначала книжки почитаешь?
а вот, кстати, еще интереснее
char aa[] = "Hello";
int* b;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
b = aa;
Serial.println(*b);
}
error: cannot convert 'char [6]' to 'int*' in assignment
Ближе к нашей дискуссии. Как видно из ошибки, компилятор считает aa
не просто указателем на чар, а именно на массив размером 6 элементов
А то, что указатели char* и int* имеют разные типы - это самое что-ни-есть базовое понятие языка.
А зачем ты указатель выводишь на печать?
хм…
указатель?
Указатель это b
, а *b
- это значение, размещенное по указателю.
Да, у меня так же получается. Странно. Компилятор такой компилятор, получается?)
Да нет, не странно. Нормальное поведение компилятора.
Странно то, что давно занимаясь программированием, ты этого не знаешь.
Обрати внимание на цитату, что привел @ЕвгенийП в сообщении 123.
Если бы компилятор не разделял указатели по типу, обращение к элементу массива по смещению было бы невозможным
Возможно. Я точно помню, что проделывал «такой финт ушами», но не помню где и когда. Возможно на php. Ох этот злой php, напрочь отбивает понятия типизации…, ((
проделать не проблема - насильно преобразовать указатель к нужному типу - и ошибка исчезнет.
char a[] = "000";
int* b = (int *)a;
только это ведь не значит, что указатели станут одного типа.
char a[] = {1,2,3,4,5};
int * b = (int *)a;
Serial.println(b[1]);
результат: 1027, т.е. 1-й элемент b имеет длину 2 байта и соответствует паре 2-го и 3-го элементов a. Чего и следовало ожидать.
А вот не соглашусь, указатель это тупо адрес в памяти и на char * и int * они будут одинаковы если это одни и те-же данные и лежат в одном и том же месте.
а пожалуйста