Основные указатели в C? - PullRequest
4 голосов
/ 16 марта 2012

У меня есть три примера различий, упомянутых ниже.Я не понимаю, почему ex1 имеет такой же выход для ex2 и отличается выходом для ex3, а также почему ex2 отличается от ex3, где я просто делаю создание в другой строке !!

ex1

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int x=2;
    int *y;
    y = &x;
    printf("value: %d\n", *y);
    printf("address: %d\n", y);
    return EXIT_SUCCESS;
}

выход

value: 2
address: 2686744

ex2

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int x=2;
    int *y = &x;
    printf("value: %d\n", *y);
    printf("address: %d\n", y);
    return EXIT_SUCCESS;
}

выход

value: 2
address: 2686744

ex3

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int x=2;
    int *y;
    *y = &x;
    printf("value: %d\n", *y);
    printf("address: %d\n", y);
    return EXIT_SUCCESS;
}

выход

value: 2686744
address: 2130567168

У меня БОЛЬШОЕ НЕПРАВИЛЬНОЕ УКАЗАНИЕ ТОЧКИ, КОГДА Я ДУМАЮ, что ЗВЕЗДА ДОЛЖНА СТАТЬ С (y) NOT (int), И Я УЗНАЮ, ЧТО ЗВЕЗДА С (int) NOT (y) (^_^) СЕЙЧАС ВСЕ ЯСНО ДЛЯ Я... СПАСИБО ЗА ВСЕ ВАШИ ОТВЕТЫ

Ответы [ 7 ]

5 голосов
/ 16 марта 2012

В примере 3 вы сначала объявляете указатель:

int *y;

и затем вы говорите, что int значение *y является адресом x.

Это потому, что с декларацией int *y у вас есть:

  • y относится к типу int *
  • *y относится к типу int.

Итак, правильные строки кода в примере 3 должны быть:

int *y;
y = &x;
2 голосов
/ 16 марта 2012

Хм, давайте приведем все в одну строку:

int *y
ex1:    y = &x
ex2:    y = &x
ex3: (*y) = &x

Ex3 отличается от двух других.

Ex3 присваивает значение (& x) значению, на которое указывает указатель y.

1 голос
/ 07 апреля 2012

При объявлении типа * означает «указатель». После этого это оператор разыменования. Рассмотрим:

int x=2;
int *y;
y=&x;
*y = x;

Это уместно, поскольку адресам назначены адреса, значения значений. Тем не менее, оператор разыменования дает вам содержимое, так что * y = x не длится долго. Вы должны относиться к этому как к временному. Вот почему, если вы передадите * y в функцию и измените ее, вы не увидите изменений при печати * y. Вы должны передать y, то есть «передать по ссылке». Короче говоря, & * y = & x нестабильно и не эквивалентно y = & x.

См. Значение l и значение r в C.

1 голос
/ 16 марта 2012

На ex3 *y = &x; означает, что вы будете хранить адрес x внутри блока памяти, на который указывает y. Это проблема, поскольку y фактически ни на что не указывает.

Все, что напечатает printf("address: %d\n", y);, не будет полезной информацией.

1 голос
/ 16 марта 2012

int *y; *y = &x; отличается от int *y = &x;. В первом случае вы устанавливаете содержимое ячейки памяти, на которую указывает y с адресом x. Тогда как в последнем случае вы инициализируете указатель y по адресу x. Поэтому, если вы удалите * из *y = &x, вы увидите тот же вывод, что и ex1 и ex2.

1 голос
/ 16 марта 2012
*y

используется для определения содержания адреса, на который указывает y

1 голос
/ 16 марта 2012

Потому что третий пример говорит *y = вместо y =

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...