【问题标题】:Can two pointer variables point to the same memory Address?两个指针变量可以指向同一个内存地址吗?
【发布时间】:2016-12-04 14:04:35
【问题描述】:

如果ptemp 是两个指针变量,其中p 包含NULLtemp 指向某个内存地址。

现在假设p = temp;

这意味着现在p 指向的地址与temp 指向的地址相同。

这是否意味着两个指针变量 ptemp 现在指向同一个内存地址?

【问题讨论】:

  • 是的,确实如此,这也是指针的用例之一。
  • 这就像问“两个整数可以有相同的值吗?”
  • @harold:对于非 2s 补充架构来说这是一个技巧问题 ;-)
  • 据我所知 Int 是一种数据类型,其中指针是指针而不是数据类型,因此 int 变量可能具有相同的值但不确定指针
  • @SinchitBatham: char* 也是一种数据类型。多个实例可以具有相同的内容。指针的内容是对象的地址。没有什么能阻止您将其存储到适当类型的多个指针中。

标签: c data-structures linked-list


【解决方案1】:

是的,两个指针变量可以指向同一个对象:

指针是变量,其值为 C 对象的地址或空指针。

  • 多个指针可以指向同一个对象:

    char *p, *q;
    p = q = "a";
    
  • 指针甚至可以指向自身:

    void *p;
    p = &p;
    
  • 这是另一个带有单个元素的双向链接循环列表的示例:nextprev 链接都指向同一个位置,即结构本身:

    struct dlist {
        struct dlist *prev, *next;
        int value;
    } list = { &list, &list, 0 };
    

【讨论】:

  • 我认为只有使用 void 指针才有可能。是这样吗?
  • @RajasubaSubramanian:是的,但是列表链接的情况类似:struct list { struct list *car, *cdr; } list = { &list, NULL ];
  • 纠正措辞,指针不是对象,它是变量..它不同..但答案就在
  • @sksallaj: variable 不是确切的术语,object 是,但是对于那些还没有掌握指针概念的人来说,它是令人困惑的.我将修改答案以避免这种混淆。
  • 啊,在最近关于它的帖子中,由于指针的表示,他们将它们称为变量,所以这给我发送了混合信号,但在查找可靠资源之后,你是对的。感谢您的澄清。
【解决方案2】:

是的!多个指针可以指向同一个东西。

【讨论】:

    【解决方案3】:

    是的,两个指针变量可以指向同一个内存地址。

    众所周知,指针是一个包含相同数据类型地址的变量。考虑以下 C 中的示例

    #include<stdio.h>
    
    int main() {
    int a,*pointer1;
    a = 10;
    pointer1 = &a;   
    int *pointer2;
    
    printf("\n Val : %d",*pointer1);    //This contains address of the variable a - so accessing it with * prints its value - value of “a"
    printf("\n Val : %d", *pointer2);   //This contains some junk value - so accessing it with * causes segmentation fault - since there might not be memory address with that junk value       
    
    pointer2 = pointer1;                //Now pointer1 reference i.e.; address value stored in pointer1 is made a copy and now both pointer1 and pointer2 will point to the same memory location
    printf("\n Val : %d", *pointer2);   //Now this would print the value of “a"
    
    return -1;
    }
    

    同样适用于链表地址。您的变量“p”和“temp”现在将指向相同的内存地址!

    【讨论】:

    • *pointer2 不仅仅是一些垃圾值,取消引用未初始化的指针会调用未定义的行为,这意味着程序可能会以各种意想不到的方式失败。
    • 当pointer2被初始化时,它会被分配一些内存。我们不知道内存位置有什么值(我称之为垃圾值)。当我们尝试在 pointer2 位置引用值时 - 编译器将其视为地址值并尝试从该位置获取值 - 这可能存在也可能不存在。
    • 从未知内存位置引用值会引发“Segmentaion fault”错误。
    • 取消引用未初始化的指针会调用未定义的行为,这可能在许多情况下会抛出Segmentation fault,但在一些较旧和更简单的架构上不会。不要依赖这样的副作用。
    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 2022-01-23
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多