Когда вы отправляете &
как arguments
в любую функцию parameters
, должно быть *
для хранения этого &
или, если есть *
в parameters
функции, вы можете отправить arguments
например, &
или *
. Это простая связь.
В Программе A:
void create(struct Stack *st)
{
printf("Enter Size");
scanf("%d",&st->size);
st->top=-1;
st->S=(int *)malloc(st->size*sizeof(int));
}
int main()
{
struct stack st;
create(&st);
return 0;
Вам нужно отправить &st
, потому что отправка &st
на create()
предоставляет вам доступ к памяти, в которой хранится st
. Если вы отправляете st
- это просто имя ячейки памяти, где хранятся данные st
- в качестве аргумента для create()
, это будет просто копирование st
в struct Stack *st
и приведет к ошибке. И вы не можете изменить исходное значение, используя его копию, как в случае scanf("%d", &st->size);
, поэтому в первой программе вам нужно отправить адрес st
.
В Program B:
struct Node
{
int data;
struct Node *next;
}*first=NULL;
void display(struct Node *p)
{
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
int main()
{
display(first);
return 0;
}
У вас уже есть адрес памяти, где хранится data
типа struct Node
, то есть значение first
. Вот почему вам не нужно делать display(&first)
в этом случае, просто сделайте копию first
и используйте ее в функции display()
.
Вы можете объяснить связь между & и * при вызове функции с примерами.
Но вы также можете сделать display(&first)
в Программе B вот так:
struct Node
{
int data;
struct Node *next;
}*first=NULL;
void display(struct Node **p)
{
while(*p!=NULL)
{
printf("%d ",(*p)->data);
*p=(*p)->next;
}
}
int main()
{
display(&first);
return 0;
}
и я надеюсь, что Пример, приведенный выше, поясняет, когда использовать *
и &
при вызове любой функции в соответствии с ее параметрами. Остерегайтесь, display
обработка данных с использованием &first
приведет к изменению адреса first
в *p=(*p)->next;
, и ваш head
указатель на связанный список будет потерян, поэтому этот пример предназначен только для демонстрационных целей.