Указатели - это именно так: указатели. Они должны указывать на что-то. Подавляющее большинство проблем, с которыми люди сталкиваются с указателями, заключается в том, что они никуда не умны: -)
Рассмотрим следующий код:
char xyzzy[] = "hello";
char *pch;
В реализации C на основе стека это, вероятно, даст вам стек, содержащий строку и указатель на произвольное значение.
Указатель существует в стеке, как и любая другая переменная, но он может указывать куда угодно.
Если вы затем выполните:
pch = xyzzy;
он указывает на первый символ xyzzy
(h
).
Массивы и указатели - это очень разных зверей. Например, вы не можете увеличивать xyzzy
, чтобы указывать на второй символ этой строки, но вы можете увеличивать pch
.
Путаница возникает из-за того, что при весьма лотах обстоятельств массивы будут затухать до указателя на первый элемент этого массива.
Это в основном причина, почему вам не нужны []
для указателей, потому что они не являются массивами. Они не знают и не заботятся о том, сколько вещей может существовать в памяти, на которую они указывают, их единственное беспокойство - это то, на что они в настоящее время указывают one .
Перемещение указателя по всему массиву и обеспечение того, чтобы вы не сходили с ума, - это дополнительное управление, которое вы должны выполнять как программист.