在下面的代码中,我能够从函数中修改main中使用的变量。
#include<stdio.h>
int main()
{
int *a,b=10;
a = &b;
printf("%d\n",*a);
ref(a);
printf("%d\n",*a);
return 1;
}
int ref(int *a)
{
int b = 98;
*a = b;
return 1;
}
然而,在下面的代码中,我无法做同样的事情。
我知道我们可以通过使用双指针从函数修改main中的值。我也知道我们可以使用单个指针进行修改,方法是将所需的地址返回给main,并使用相同的数据类型将其输入main。我只想知道是否可以通过将其作为参数传递给函数来修改main中的值,仅作为指向(结构)变量的单个指针。
注意:我用评论'// WC'表示了工作代码。如果有人能解释我一样,我将非常感激。
//int insert(int data, Node **head) //WC
int insert(int data, Node *head)
{
Node *temp, *run;
temp = (Node *) malloc(sizeof(Node));
temp->data = data;
temp->next = NULL;
//if(*head == NULL) //WC
if(head == NULL)
{
printf("1st node\n");
//*head = temp; //WC
*head = *temp;
}
else
{
printf("node after first\n");
//run = *head //WC
*run = *head;
while(run->next != NULL)
{
run = run->next;
}
run->next = temp;
}
return 1;
}
int main()
{
Node *head;
insert(10, head);
insert(20, head);
insert(30, head);
insert(40, head);
insert(50, head);
return 1;
}
答案 0 :(得分:2)
当您检查head是否为空(具有NULL值)时,您需要检查head(* head)的内容,而不是head本身,因为这意味着它自己的地址。所以if(head == NULL),应该是* head == Null。 head表示指针头的内存地址,* head表示在该地址中保存的内容(指向的内容)。有了这个逻辑,* head = temp;是正确的,因为它将保存动态分配的内存地址的地址-temp在头部但是后一个(* head = * temp)将尝试将temp的内容复制/保存到head,这是没有意义的,因为head is只有一个指针的大小,temp可以分配节点的大小。我希望我至少帮助了一下,这是你的代码的工作版本:))
int insert(int data, Node **head) //WC, This is correct because the parameter **head takes address of the pointer to the first node if any.
//int insert(int data, Node *head)
{
Node *temp, *run;
temp = (Node *) malloc(sizeof(Node));
temp->data = data;
temp->next = NULL;
if(*head == NULL) //WC, checking if head has any address value inside (not its own address)
{
printf("1st node\n");
*head = temp; //WC, because temp has address of the allocated memory and you wanna hold that address as the head / first node.
}
else
{
printf("node after first\n");
run = *head //WC
//*run = *head; you can't use this, one reason is because head could point to any size of memory (e.g 10000kb) and run has a size of a pointer, just few bytes.
while(run->next != NULL)
{
run = run->next;
}
run->next = temp;
}
return 1;
}
(编辑:使用多指针可能会使阅读变得复杂,所以我宁愿使用以下结构定义)
typedef struct node* PNode; //Pointer to node
typedef struct node {
int item;
Pnode next;
} Node;
void insert(int data, PNode *head) {
PNode temp, run = *head;
temp = (PNode)malloc(sizeof(Node));
temp->data = data;
temp->next = NULL;
if (run == NULL){
*head = temp;
}//first node
else{
while (1) {
if (run->next == NULL) {
run->next = temp;
break;
}
run = run->next;
}
}
}
答案 1 :(得分:1)
如何将单个指针传递给函数内部的结构并修改该结构变量?
TL; DR:您可以修改指针指向的值,但不能修改传递的指针本身。
C
使用pass-by-value进行函数参数传递。您不能从被调用函数更改接收参数的值,并期望它在用作调用函数的参数的变量中 reflect 。
但是,如果是指针,通常不会修改指针本身,而是修改它指向的值。因此,该指针指向的更改值将在调用函数中反映。