Подтвердить что ты не робот

Проблема с 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, чтобы он отображался.

Принимаются любые советы/предложения/критика.

4b9b3361

Ответ 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;
}