Что происходит в scanf () при использовании оператора &? - PullRequest
0 голосов
/ 11 сентября 2011

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

struct film {
    char title[TSIZE];
    int rating;
    struct film * next;
}

int main(void)
{
    struct film * head = NULL;
    struct film * prev, *current;
    char input[TSIZE]; 

    // some code ommitted

    strcopy(current->title, input);

    puts("Enter your rating <0-10>");

    scanf("%d", &current->rating);
}

В основном мой вопрос касается функций strcopy () и scanf ().Я заметил, что в strcopy первый параметр использует оператор доступа к элементу -> для указателя на структуру.Я считаю, что первым аргументом strcopy должен быть указатель на char, поэтому при использовании оператора доступа к члену мы получаем прямой указатель на title, даже если title не объявлен как указатель внутри структуры?

Меня смущает, как это контрастирует с вызовом scanf (), где мы используем оператор &, чтобы получить адрес current-> rating.Сканирует ли scanf () адрес указателя структуры, а затем осуществляет доступ к члену или это адрес члена структуры «рейтинг»?Почему бы просто не передать указатель аналогично strcopy ()?

Я полагаю, что есть разница между выполнением ¤t-> rating vs & (current-> rating)?Ratingt-> оценивает адрес указателя (вроде как указатель на указатель?).

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 11 сентября 2011

Когда вы передаете массив в качестве аргумента функции в C, компилятор фактически передает указатель на первый элемент в массиве.arrayVar совпадает с &arrayVar[0].Итак, первый аргумент функции strcopy - это указатель на первый элемент массива символов title в структуре, на которую указывает current.

Когда вы передаете функцию int в функцию,вы просто передаете значение переменной, а не указатель на нее.Поскольку scanf требует указатель, в котором будет храниться значение, вы должны использовать &, чтобы получить указатель на переменную.Второй аргумент scanf является указателем на целое число rating в структуре, на которую указывает current.

2 голосов
/ 11 сентября 2011

получаем ли мы прямой указатель на заголовок, даже если заголовок не объявлен как указатель внутри структуры?

Чтобы полностью понять ответ на этот вопрос, вам необходимо понять, как данные хранятся в памяти.

По сути (для простоты) у компьютера есть ряды блоков памяти, у каждой части есть адрес (как у ряда домов). Одна переменная (например, char A;) имеет только один дом и, таким образом, является статическим адресом. Массив переменных (например, char Arr [10]) имеет несколько домов (все в ряд), но сам массив (указатель) может указывать только на один дом за один раз.

Немного похоже на использование ленты. Поэтому, когда вы говорите Array [1], вы на самом деле говорите: «относительно первого дома [0], переходите к следующему дому [1]» (или, более технически, адрес памяти плюс размер указателя, умноженный на то, как много блоков, которые вы хотите пройти мимо).

Сканирует ли scanf () адрес указателя структуры, а затем осуществляет доступ к члену или это адрес члена структуры "rating"?

Это адрес члена структуры, рейтинг. Обычно для пояснения разыменования можно использовать скобки, поэтому & (current-> rating), а не проходящий ток (& current), но обычно компиляторы знают, что происходит разыменование, хотя брекетинг может помочь, если есть проблема.

Почему бы просто не передать указатель аналогично strcopy ()?

Массив технически является указателем (сортировка нескольких домов), где рейтинг не имеет указателя (один дом, не нужен). Если бы у вас был массив целых чисел, вы бы смогли это сделать.

1 голос
/ 11 сентября 2011

current->title уже указатель (тип char[]), поэтому вам не нужен оператор &, в то время как current->rating не указатель (тип int), поэтому вам нужнополучить адрес переменной (это то, что здесь делает оператор &).

...