代码到我的链表程序:这是我保存在github上的代码
知道指针总是接受变量的地址。所以如果有人只写了数组的名字意味着这是数组第一个元素的地址。好的,没错,这就是地址,所以我们不需要在数组名前面写&
。但是如果是其他的东西,我们必须用&
符号。对于int
,我们把&
的符号写在前面。但是如果结构也是一种定制尺寸的变量呢?
数组的代码可能像这样:
int arr[] = {34,234,6234,346,2345,23};
int i;
for(i=0; i<(sizeof(arr)/arr); i++)
int *pointer = arr+i; //Now pointer can point to all the member array one by one
int类型的代码可能如下所示:
int a = 5;
int *pointer = &a;
但是如果我有两个指针(head &到struct node
类型的结构体。现在我正在为node.
struct node {
int data;
struct node *next; // this is pointer to next element in the Linked List
};
现在最初头是NULL,即不指向任何东西head = NULL;
但是在第一次插入链表时,如果这样做:
head = temp; // both are pointers
知道head只能取地址因为它是指针而temp不是数组所以如果写这个写temp并不意味着它是结构体temp的地址
我应该这样做吗
head = &temp
实际上得到那个临时结构(指针)的地址?
我有一种感觉,我们做head = temp
和有效的原因,如数组temp
是类型结构节点的指针。所以写temp
只意味着内存中临时指针的地址。现在head
指针的地址是temp
&指向head
有什么?
是head
指向temp
的地址,还是head
指向temp的地址,我猜指向和having是不同的
为了解释我的评论,请看下面的粗图:
对于head = temp
,它看起来像
这意味着head
和temp
都指向同一个位置。
另一方面,如果您执行head = &temp
(并且编译器允许这样做),它将看起来像
也就是说,head
指向temp
,而不是指向你的结构。
head
和temp
的类型均为struct Node*
。将temp
赋值给head
意味着head
所指向的位置与temp
所指向的位置相同。&temp
是指向struct NODE
类型的temp
变量的地址,即struct Node**
。
temp
和&temp
是不同的类型。编译器应该对赋值
head = &temp; // assigning incompatible pointer without cast
对于单个变量,无论是int
还是char
,操作符&用于引用该变量。在整数数组的情况下,数组的名称arr[]即arr本身代表数组的第一个元素的地址。下面是指针算术操作数组的内部操作:
引用第i个元素,我们写arr[i] = *(arr + i)
因此,arr[0] = *(arr + 0) = *(arr)
但是在您的示例中,head
和temp
是类型为struct node*
的指针。使用,将temp的地址赋值给head的运算符首先不会被编译器允许给出强制转换错误,而且它也不会满足您的目的。你应该做的是head = temp
,这将使head
和temp
指向struct node
。