Nick_is_asking Ответов: 1

Первый раз с указателями в C (проблема в выводе)


Привет всем!!!
Сегодня я начал использовать указатели на языке Си, и у меня возникла проблема с выводом данных.

У меня есть это
[^]ошибка[^]

Я попытался изменить %d на %ls ,как он говорит, но в выходных данных он не показывает мне адреса .
В чем же проблема?
Заранее спасибо !!!

Что я уже пробовал:

Код:
#include <stdio.h>

int main()
{
    int x;
    int *p;
    p = &x;

    *p = 75;
    printf("price of x = %d ,\t price of pointer p = %d ,\t address of x => %d ,\t address of pointer p = %d \n" , x , *p , &x , p);

    x = 999;
    printf("price of x = %d ,\t price of pointer p = %d ,\t address of x => %d ,\t address of pointer p = %d \n" , x , *p , &x , p);

    *p++;
    printf("price of x = %d ,\t price of pointer p = %d ,\t address of x => %d  ,\t address of pointer p = %d \n" , x , *p , &x , p);

    return 0;
}

1 Ответов

Рейтинг:
12

OriginalGriff

Попробовать это:

printf("Price of x = %d\nPrice via pointer p = %d\nAddress of x = %p\nAddress pointed to by p = %p\n", x, *p, &x, p);


Nick_is_asking

Это работает. Спасибо!!!

Nick_is_asking

Еще один вопрос.Если x = 8 и я пишу это: *p++; то я получаю это:
цена х = 9 , Цена указатель p = -971355120 , адрес х =&ГТ; 0x7ffec61a4c0c , адрес указателя P = 0x7ffec61a4c10
=============================
но я ожидал этого .:
цена х = 9 , Цена стрелочного п = 9 адрес =х&ГТ; 0x7ffec61a4c0c , адрес указателя P = 0x7ffec61a4c10

или я ошибаюсь?

OriginalGriff

Вы ошибаетесь: все сводится к приоритету оператора. "Оператор постинкремента" (p++) выше, чем "оператор разыменования" (*p), поэтому *p++ увеличивает указатель, а не содержимое указателя, а затем возвращает значение, на которое теперь указывает. Если вы хотите увеличить x через p, то вам нужны скобки, чтобы принудительно установить нужный порядок: (*p)++

Rick York

вы должны избегать написания таких выражений, потому что они могут быть подвержены ошибкам. Лучше сначала разыменовать указатель (*p) и использовать это значение. Затем увеличьте указатель, когда вы закончите с его значением.

Nick_is_asking

хорошо, я понимаю, Спасибо!!

OriginalGriff

Всегда пожалуйста!

CPallini

5.