Проблема с C-указателями
Здесь сделка. У меня большой массив символов и я пытаюсь манипулировать им. Вот какой код я использовал для проверки идеи:
#include <stdio.h>
char r[65536],*e=r;
main() {
e+=8;
while(*e) {
*e+=1;
e+=5;
*e-=1;
e-=1;
}
*e+=1;
printf("%i",*e);
printf(" %c",e);
}
Что он должен сделать:
- Установите первый элемент в 8
- Тогда, когда текущий элемент не равен нулю,
- Переход к следующей ячейке
- Добавить 5 к нему
- Перейти назад
- Вычтите один. (Это повторяется 8 раз, потому что тест while завершится неудачно, когда он вычитает последний)
- Отобразить расположение указателя
- Отобразить содержимое массива, на которое указывает указатель (надеюсь)
Что он делает:
1 Φ
в отличие от
40 (
^^ 8 x 5 = 40, чтобы он отображался.
Принимаются любые советы/предложения/критика.
Ответы
Ответ 1
Вы разыскиваете точно, где вам нужно не и наоборот. Что вы хотели сделать:
*e+=8;
while(*e) {
e+=1;
*e+=5;
e-=1;
*e-=1;
}
*e+=1;
printf("%d",e - r); //index
printf(" %p",e); //pointer value
printf(" %c",*e); //pointee value
*
извлекает значение, на которое указывает указатель.
Ответ 2
"Установить первый элемент в 8" будет
*e = 8;
"Перейти к следующей ячейке" будет
e += 1;
и т.д.
С помощью e
вы получаете доступ к указателю, адресу. Приращение/уменьшение его приведет к перемещению указателя вперед и назад.
С *e
вы получаете доступ к значению, на которое оно указывает (разыщите его).
Вы используете его по-другому в большинстве случаев.
Примечание. Обратите внимание: в объявлении e
вам нужно написать char *e = r;
для инициализации указателя (а не значения). Здесь *
указывает тип e
. Объявление гласит: e
является указателем на char
, и его значение равно (адрес) e
--- оно похоже на char *r; r = e;
.
Ответ 3
*e
разделяет указатель; т.е. манипулирует указанным значением. Манипуляция самим указателем означает непосредственное управление e
.
Когда вы выполняете e+=5
, вы перемещаете указатель вперед на 5 пробелов, если вы делаете *e+=5
, тогда вы добавляете 5 к значению, на которое указывает указатель.
Ответ 4
Вы неправильно понимаете арифметику указателей и разыгрывание.
*e
используется для доступа к тому, на что указывает e
, поэтому *e += 1
увеличивает значение, на которое указывает e
, а не переходит к следующему адресу. Кроме того, e += 8
увеличивает фактический указатель, а e
теперь укажет на девятую запись в массиве.
Ответ 5
Вы сбиваете с толку свое разыменование. Оператор *
при вызове указателя дает вам данные, хранящиеся в этом месте. Без него вы получите адрес.
Ответ 6
Возможное решение:
#include <stdio.h>
char r[65536];
char* e = r;
main() {
*e = 8;
while(*e) {
e++;
*e+=5;
e--;
*e-=1;
}
e++;
printf("position : %i\n",e-r);
printf("value : %c\n",*e);
}
Вы просто смешали * и &.
Если P является указателем, то * P - это значение, указанное указателем.
Если V - значение, то V - адрес, в котором сохраняется значение.
Ответ 7
#include <stdio.h>
char r[65536], *e=r;
int main()
{
*e = 8;
while (*e) {
e++;
*e += 5;
e--;
*e -= 1;
}
e++;
printf("%p %c\n", e, *e);
return 0;
}