我对指针的基本知识是它们指向一个内存位置,它们可用于更改和提取存储在该地址的值。 例如。
int a=5;
int *b;
b=&a;
现在这里b指向一个。
的内存位置cout<<*b; //gives the output 5
cout<<b; //outputs the address of a.
基本上是出于此目的,通过引用在函数和数据结构(如链表和树)中传递值。
main()
{
node *head=NULL;// A pointer head of type node structure
add(&head,2); //adds the value to linked list
}
void add(node**head,int data)
{
//adds value into node
}
任何人都可以告诉我为什么&amp; head在add()函数中被接收为** head 如果收到它作为* head会有什么不同呢?
当我打印** head的值时,它给了我一个编译器错误。
答案 0 :(得分:0)
head类型是node *,当你得到node *(&amp; head)的地址时,它的类型是node **。
节点**和节点*之间的差异与int *和int相同。其中一个定义了指向其他类型的指针。
add方法获取指针,因为它可能会更改head的值。如果* head为NULL,则应创建一个新节点并将 head指向此新节点的地址。如果只输入节点头,则指定head = malloc(...)将不起作用,因为c是按值传递的,它只是指定在函数内定义的“head”,而不是在main中。但如果获得主要头部的地址,它可以通过访问它来自由地改变它,如* head = malloc(...)
head是一个指针,所以你无法真正打印它的值(好吧,如果你施放它就可以,但它不会有任何意义)。你可能需要施展它
答案 1 :(得分:0)
int *p; // p -> is a pointer to an int, *p -> integer contained in address pointed by p.
类似地
int **p2; // p2 -> a pointer to a pointer to an it, *p2 -> pointer to a int, **p2 int.
如果您感到困惑,可以将其记住作为覆盖规则。如果你想知道* p是什么,只需要覆盖* p(我们有int所以它是一个int),如果你知道* p2是什么,只需要覆盖它(我们有int *意味着它是一个指向int的指针)。
答案 2 :(得分:0)
这是我对另一个问题的回答:https://stackoverflow.com/a/20818342/2805305
问题是关于操作的错误,但在我的回答中,我确切地解释了你需要知道的内容。