Как уже говорили другие, вы можете легко выполнить первую часть. Просто сделай pointer = array + 6
. Но что такое pointer
? Он не может быть объявлен как:
char pointer[5];
или аналогичный. Это должен быть указатель :
char *pointer = array + 6;
Это потому, что вы не можете присвоить массив какому-либо другому имени (массив не является изменяемым l-значением). Не имеет смысла говорить:
char a[10];
char b[10];
b = a;
Теперь в C размер указателя равен размеру указателя & mdash; так как указатель не имеет понятия "количества единиц" указанного типа. Массивы, с другой стороны, точно знают, сколько у них элементов, и вы можете получить этот размер, применив соответствующий оператор sizeof
.
Итак, sizeof array
в вашем примере будет 10 (если в нем 10 элементов), тогда как sizeof pointer
будет числом байтов, занятым указателем char
. Следовательно, то, что вы спрашиваете во второй части вашего вопроса, невозможно в C . В C ++ у вас есть доступ к типам данных, которые должны позволять вам делать то, что вы хотите.
Редактировать : Чтобы прочитать файл кусками:
Допустим, у вас большой буфер, и вы уверены, что можете прочитать весь файл в:
unsigned char bigbuf[1UL << 24]; /* or whatever you want */
unsigned char *ptr = bigbuf;
size_t chunk = BUFSIZ;
FILE *fp = fopen("foo.txt", "rb"); /* no error checking */
size_t nread;
size_t total = 0;
while ((nread = fread(ptr, 1, chunk, fp)) > 0) {
ptr += nread;
total += nread;
if (total + chunk > sizeof bigbuf) {
/* oops, not enough space */
}
}
if (ferror(fp)) {
/* read error */
} else {
/* bigbuf now has data, total has the number of bytes */
}
Для небуферизованного ввода / вывода посмотрите setvbuf()
. Но проверьте буферизованные и небуферизованные входы, чтобы увидеть, какой из них быстрее Проверьте также различные размеры чтения.
Теперь отступ, который я положил раньше, и, думаю, я все равно оставлю это здесь:
Отвечая на этот вопрос, интереснее делать это по-другому , т.е., учитывая:
T a[10];
для любого типа T
, можете ли вы объявить pointer
таким, что:
pointer[1] == a[0]
pointer[2] == a[1]
...
pointer[11] == a[10]
(или, если вы чувствуете себя авантюрным, замените 1 большим положительным числом в LHS первого утверждения).
Ответ, согласно стандарту C, нет . Как упомянуто в ссылке, Численные рецепты в C использовали этот «трюк».
В сторону, я думаю, вы имели в виду
pointer[0] == array[6];
а не
*pointer[0] == array[6];
в вашем вопросе (аналогично для *pointer[5]
)