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

#c

#c

Вопрос:

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

 int is_full(StackType *s)
{
    return (s->top == (MAX_STACK_SIZE -1)); 
}
 
 void push(StackType *s, element item)
{
    if (is_full(s)) {
        fprintf(stderr, "errorn");
        return;
    }
    else {
        s->data[  (s->top)] = item;
    }   
}
 
 int main()
{
    StackType s;

    init_stack(amp;s);
    push(amp;s, 1);
    push(amp;s, 2);
    push(amp;s, 3);

    printf("%dn", pop(amp;s));
    printf("%dn", pop(amp;s));
    printf("%dn", pop(amp;s));
}
 

В первой функции я устанавливаю is_full(StackType *s)
Во второй функции я устанавливаю push(StackType*s, element item)

Вторая функция вызывает if (is_full(s)) основные вызовы push(amp;s, 1)

Это одна и та же функция, но почему ее вызов отличается?

Комментарии:

1. In push , s уже является указателем. В main нем находится объект (структура).

Ответ №1:

Тип переменной s в функции main равен StackType .

Тип переменной s в функции is_full равен StackType* .

Комментарии:

1. Ооо… Большое вам спасибо

Ответ №2:

Хотя goodvibration верен в своем ответе, также важно знать, что вы передаете amp; адрес в StackType , который является *s переменной указателя, хранящейся внутри — a, содержащей переданный ей адрес, что позволяет выполнять операции с памятью (например, те, которые выполняются в else случае)