我在理解链表代码中的指针和结构定义时有一个简单的问题。
1)
typedef struct node
{
struct node* next;
int val;
}node;
这里如果我在初始化node * head时使用两个“node”;我指的是哪个节点?
2)这里我在struct中使用了一个int val。如果我使用void *而不是int那么有什么东西会改变吗?
3)如果我传递给函数
reverse(node* head)
{
node* temp = head; or node* temp = *head;
//what is the difference between the two
}
如果这些是愚蠢的问题,我很抱歉我是c语言的新手。
谢谢&问候, 布雷特
答案 0 :(得分:0)
&LT 1为卤素; 在C中,您需要为结构
指定结构节点 struct node
{
...
} node;
最后一个'node'是struct node类型的变量 例如
node.val = 1;
而不是类型。
如果你想使用'node'作为你需要写的类型
typedef struct node { .. } node;
&LT 2 - ; 如果使用void *,则需要一种机制来处理指针指向的内容,例如如果void *指向一个整数,则需要将整数保留在堆栈或堆上。
node n;
int value = 1;
n.val = &value; // pointing to a single integer on stack
int values[]={1,2,3};
n.val = values; // pointing to an array of integers on stack
void* ptr = malloc(sizeof(int));
n.val = ptr; // pointing to a single (uninit) integer allocated on heap
int* ptrval = (int*)ptr; // setting an int ptr to the same memory loc.
*ptrval = value; // ptrval now points to same as n.val does
&LT 3的密度; 反转(节点*头) head是指向列表的指针,* head是指针指向的内容(下面的第一个节点)
head-> [node next] - > [node next] - > [node 下一个]
编辑:改编和编辑。 EDITx2:显然问题已被编辑,并且添加了typedef,因此问题被更改了。
答案 1 :(得分:0)
*head
是指针的取消引用:即指针head
指向的内存中的实际位置......
将head
视为衣架,将*head
视为大衣本身,如果有帮助的话。
即:
struct * coat c; //this is a coat hanger, not a coat
....
struct coat k = *c;//this is the coat itself, not a coat hanger
答案 2 :(得分:0)
对于#1:
在C中,struct具有单独的名称空间。所以如果你写了:
struct foo { ... };
然后,您必须使用struct foo
来引用该类型。如果您在上面的定义之后只尝试foo
,编译器会给出错误,因为它不知道有关该非限定名称的任何信息。
typedef
为类型提供备用名称。 typedef
名称不需要限定,所以一旦你这样做了:
typedef struct foo foo;
您现在可以使用不合格的foo
来引用该类型。由于它只是一个替代名称,您现在可以互换使用struct foo
和foo
。
#2。
如果您将val
更改为void *
,则可能会更改整个结构的大小。这是否有所作为取决于你编写其余代码的方式。