Присвоение указателя / указателя переменной и вывод на печать - PullRequest
1 голос
/ 14 апреля 2020

Я довольно новичок в указателях в C, и у меня был практический вопрос, и я не понимаю, почему ответ таков, каков он есть. Код выглядит следующим образом:

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

void changeValue(int *valuePassed)
{
    *valuePassed = 100;
}

int main()
{
    int testValue = 9;
    changeValue(&testValue);
    printf("%d\n", testValue);
}

Это завершает печать 100, и я не уверен, почему.

Во-первых, передается ли функции changeValue переменная-указатель или она передается Значение по адресу valuePassed (из того, что я знаю, это две разные вещи). Во-вторых, строка * valuePassed = 100 устанавливает значение в местоположении valuePassed на 100, правильно? Но valuePassed не был назначен адрес. Итак, если адрес testValue (& testValue) передается в функцию changeValue, как печатается 100?

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

Во-первых, передается ли в функцию changeValue переменная-указатель или передается значение по адресу valuePassed (насколько я знаю, это две разные вещи)

Существует передан адрес переменной testValue

changeValue(&testValue);

, назначенной переменной-указателю valuePassed, являющейся параметром функции и одновременно локальной переменной функции ..

void changeValue(int *valuePassed)

Вы можете представить вызов функции и определение функции следующим образом

changeValue(&testValue);

//...

void changeValue( /* int *valuePassed */ )
{
    int * valuePassed = &testValue;
    *valuePassed = 100;
}

Но для valuePassed не был назначен адрес.

Вы неправы. Как вы можете видеть выше, он был назначен по адресу переменной testValue.

Так что, если адрес testValue (& testValue) передается в функцию changeValue, как печатается 100?

Th целочисленная константа 100 не указана. Это указанная переменная testValue и ее указанная память, в которой определяется переменная, хранится целочисленная константа 100.

В терминах C передача объекта косвенно через указатель на это называется передачей по ссылке.

Из C стандарта (6.2.5 Типы, стр. # 20)

- тип указателя может быть получен из типа функции или типа объекта, называемого ссылочный тип. Тип указателя описывает объект, значение которого предоставляет ссылку на объект ссылочного типа. Тип указателя, полученный из ссылочного типа T, иногда называют «указателем на T». Конструкция типа указателя из ссылочного типа называется «выводом типа указателя». Тип указателя является полным типом объекта.

1 голос
/ 14 апреля 2020

- функция changeValue, которой передается переменная-указатель, или ей передается значение по адресу valuePassed

& testValue - это адрес переменной valuePassed

* valuePassed = 100 устанавливает значение в местоположении значенияPassed на 100, правильно?

" valuePassed = 100;"изменяет значение переменной valuePassed , но здесь из-за" * "форма" * valuePassed = 100;"изменяет значение, адрес которого запоминается в valuePassed . Поскольку valuePassed определяет адрес valuePassed , назначение изменяет значение valuePassed на 100

 printf("%d\n", testValue);

печатает 100, являющееся текущим значением testValue

Это цель указателей

0 голосов
/ 14 апреля 2020

Итак, если адрес testValue (& testValue) передается в функцию changeValue, как печатается 100?

Волшебство c происходит здесь из-за двух вещей:

  1. valuePassed был назначен по адресу testValue при вызове changeValue() как valuePassed:
changeValue(&testValue);

Обратите внимание, что & возвращает адрес объекта.

Оператор разыменования * в:
    *valuePassed = 100;

Этот оператор разыменовывает указатель valuePassed. Означает, что он обращается к объекту valuePassed указывает на.

Таким образом, 100 присваивается объекту testValue внутри main() и 100 печатается при вызове printf() в дальнейшем.

...