Проблема с указателями C - PullRequest
11 голосов
/ 27 января 2012

Вот сделка. У меня большой массив символов, и я пытаюсь им манипулировать. Вот некоторый код, который я использовал, чтобы проверить идею:

#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);
}

То, что он должен сделать, это:

  1. Установите первый элемент на 8
  2. Тогда, пока текущий элемент не равен нулю,
    1. Перейти к следующей ячейке
    2. Добавить 5 к нему
    3. Движение назад
    4. Вычтите один. (Это повторяется 8 раз, потому что тест while будет неудачным, если вычесть последний)
  3. Отображение местоположения указателя
  4. Показать содержимое массива, на который указывает указатель (я надеюсь)

Что он делает:

1 Φ

в отличие от

40 (   

^^ 8 x 5 = 40, так что это должно отображаться.

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

Ответы [ 7 ]

10 голосов
/ 27 января 2012

Вы разыменовываете точно , где вы должны не и наоборот. Что вы хотели сделать, это:

*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

* возвращает значение, на которое указывает указатель.

7 голосов
/ 27 января 2012

«Установить первый элемент на 8» будет

*e = 8;

"Перейти к следующей ячейке" будет

e += 1;

и т. Д.

С e вы получаете доступ к указателю, адресу. Увеличивая / уменьшая его, вы перемещаете указатель вперед и назад.

С помощью *e вы получаете доступ к значению, на которое оно указывает (разыменовываете его).

В большинстве случаев вы используете его наоборот.

Примечание : обратите внимание, что в объявлении e вам нужно написать char *e = r; для инициализации указателя (а не значения). Здесь * указывает тип e. Объявление гласит: e - это указатель на char, а его значение (адрес) e --- это похоже на char *r; r = e;.

6 голосов
/ 27 января 2012

*e разыменования указатель; то есть он манипулирует указанным значением. Манипулирование указателем само по себе означает манипулирование e напрямую.

Когда вы делаете e+=5, вы перемещаете указатель вперед на 5 пробелов, если вы делаете *e+=5, то вы добавляете 5 к значению, указанному указателем.

2 голосов
/ 27 января 2012

Вы путаете разыменование.Оператор * при вызове указателя дает вам данные, хранящиеся в этом месте.Без него выдает адрес.

2 голосов
/ 27 января 2012

Вы неправильно понимаете арифметику и разыменование указателя.

*e используется для доступа к тому, на что указывает e, поэтому *e += 1 увеличивает значение того, на что указывает e, а не идет к следующемуадрес.Кроме того, e += 8 увеличивает фактический указатель, а e теперь будет указывать на девятую запись в массиве.

1 голос
/ 27 января 2012

Возможное решение:

#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 является адресом, где хранится значение.

0 голосов
/ 27 января 2012
#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...