【问题标题】:how the pointers get the address of variables, arrays, pointers, structures指针如何获取变量、数组、指针、结构的地址
【发布时间】:2014-08-08 10:38:32
【问题描述】:

我的链表程序的代码:This is the code I saved on 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; 

但如果我有两个指向struct node 类型结构的指针(head 和 temp)。现在我正在为节点编写代码。

struct node {
    int data; 
    struct node *next;   // this is pointer to next element in the Linked List
};

现在 head 最初是 NULL 即不指向任何东西 头=空;

但是在第一次插入链表时,如果这样做:

head = temp;       // both are pointers

知道 head 只能获取地址,因为它是一个指针,但 temp 不是一个数组,所以如果写这个写 temp 并不意味着它是那个结构 temp 的地址

我应该这样做吗

head = &temp

要实际获取该临时结构(指针)的地址吗?

我感觉我们做了head = temp 并且像数组temp 这样的有效原因是结构节点类型的指针。所以写temp 仅仅意味着内存中临时指针的地址。现在head 指针的地址为temp 并指向head 的地址?

head 指向temp 的地址还是head 现在具有临时地址。我猜指向和拥有是不同的。

【问题讨论】:

  • sizeof(arr)/arr 是什么意思???你可能想要sizeof(arr)/sizeof(*arr)...
  • 指针在技术上是一个整数值,其中值是指针指向的地址。如果你想要例如head 指向 temp 指向的位置,直接赋值是你应该做的。如果使用 address-of 运算符,则告诉 head 指向 temp 变量,而不是 temp 指向的变量。
  • 您似乎混淆了“事物的地址”和“不同事物的地址”。 any 对象x 的地址始终为&amp;x。数组也是如此。但是另外数组表达式本身会衰减为一个指针——但是一种不同类型的指针!它衰减为指向第一个元素的指针。那是与阵列本身不同的动物。所以arr&amp;arr 都存在并且有意义,它们只是不同的东西。
  • 我认为你混淆了指针地址和指针指向的地址。
  • 如果您觉得您的问题可能会被误解或得到一个过于正式的答案,粗体加斜体字体不会改变这一点……

标签: c arrays pointers linked-list


【解决方案1】:

要解释我的评论,请参阅以下粗图:

对于head = temp,它看起来像

+------+ |温度 | --\ +--------+ \ +----------------+ >--> |您的结构 | +--------+ / +----------------+ |头| --/ +------+

这意味着headtemp 都指向同一个地方。


如果你另一方面做head = &amp;temp(并且编译器允许它),它看起来像

+------+ +------+ +----------------+ |头| ---> |温度 | ---> |您的结构 | +------+ +------+ +----------------+

也就是说,head 指向temp,而不是你的结构。

【讨论】:

  • 在这种情况下我的结构是什么@JoachimPileborg?结构节点?
  • @AbhimanyuAryan 实际结构无关紧要。它甚至不需要是一个结构。我只是解释在这两种情况下会发生什么。
【解决方案2】:

headtemp 都是 struct Node* 类型。将temp 分配给head 意味着head 指向的位置与temp 指向的位置相同。 &amp;temptemp 变量的地址,它是指向struct NODE 类型的指针,即struct Node**

temp&amp;temp 都是不同的类型。你的编译器应该对赋值发出警告

head = &temp;  // assigning incompatible pointer without cast

【讨论】:

    【解决方案3】:

    对于单个变量,无论是int 还是char,运算符& 的地址都用于引用该变量。在整数数组的情况下,数组 arr[] 的名称,即 arr 本身代表数组第一个元素的地址。看看下面指针算术运算数组内部是如何做的:

    为了引用第 i 个元素,我们编写 arr[i] = *(arr + i) 所以,arr[0] = *(arr + 0) = *(arr)

    但在您的情况下,headtempstruct node* 类型的指针。编译器首先不允许使用 & 运算符将 temp 的地址分配给 head 并给出强制转换错误,而且它也不会满足您的目的。你应该做的是head = temp 这将使headtemp 指向struct node

    【讨论】:

    • 那么指向数组的指针和指向指针的指针不同吗?我的意思是,如果这个 temp 是一个数组,那么 head 将指向 aaray & 但现在它是一个指针,所以 head 指向任何 temp 指向的对象
    • 是的,它们是不同的,当你声明a[3]之类的东西时,'a'代表数组的基地址。但是 &a 不是指向指针 int * 的指针,而是指向整数数组的指针 int()[]....这与 int ** 不同,因此编译器错误。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2018-01-21
    相关资源
    最近更新 更多