Автор мог бы быть более понятным здесь, я согласен.Указатель тоже является именованной переменной, но если он указывает на массив, он не имеет никакой информации о длине массива.На самом деле, он не знает, что он указывает на массив.Синтаксис p[100]
действителен (хотя и не определен), даже если p
был назначен адрес одного int
или другого типа данных.
Именно поэтому, когда массив передается в качестве аргумента дляфункция, это либо:
- Сопровождается параметром "length", который доверяет вызывающему коду для правильной его передачи
- Завершается значением часового значения (как нулевой терминатор для строк)
Чтобы более четко продемонстрировать это различие, попробуйте следующее:
int arr[3] = { 1,2,3 };
int *ptr;
ptr = &arr;
Я получаю следующее предупреждение компиляции:
'=': 'int *' differs in levels of indirection from 'int (*)[3]'
Но, если вы измените ptr
для указания на первый элемент arr
(что происходит, когда arr
распадается на указатель), проблем нет:
ptr = &arr[0];