【问题标题】:difference between setting up pointer with address-of operator使用地址运算符设置指针的区别
【发布时间】:2013-04-01 09:23:38
【问题描述】:

我想知道以这种方式设置 C 指针的最大区别是什么:

int int_var = 5;
int *int_ptr = &int_var;

这样:

int int_var = 5;
int *int_ptr = int_var;

因为在这两种情况下*int_ptr 的结果都是 5,不是吗?

【问题讨论】:

  • 在这两种情况下,*int_ptr 的结果都是 5,不是吗? 不是。
  • 在第二种情况下,*int_ptr 将是存储在内存地址 5 的任何内容。换句话说,垃圾。
  • 提示:调高编译器的警告级别和/或注意您已经收到的警告;)。
  • 你使用gcc吗?然后激活所有警告:-Wall -Wextra -pedantic。这应该已经告诉您发生了异味。
  • @jpm 由于很少映射如此低的地址,操作系统更有可能将其视为无效访问。

标签: c pointers addressof


【解决方案1】:

不,仅在第一种情况下。当您尝试尊重指针时,第二种情况将导致未定义的行为。使用第一种情况。

一些解释:

int int_var = 5;
int *int_ptr = &int_var; // here int_ptr will hold the address of var

int int_var = 5;
int *int_ptr = int_var; // here int_ptr will hold the address 5.

【讨论】:

  • 好的,这也适用于数组吗?
  • @arielshon12 什么意思?
  • 我应该写这样的代码:int array[20]; int *ptr=array; 还是操作员的地址?
  • @arielschon12:你可以这样写代码,因为int[20] 可以衰减为int*。你不应该,只要你不知道你实际上在做什么。
  • @arielshon12 取决于您要实现的目标。它不会复制任何东西(如果这是您期望发生的)。
【解决方案2】:

没有。第一种情况5,第二种情况是未定义的,是地址5的内存内容吗??

【讨论】:

    【解决方案3】:

    不,int_ptr 是一个指针,所以你必须在定义它时为其分配一个地址

    第一个是正确的

    int int_var = 5;
    int *int_ptr = &int_var;
    

    另一个是错的

    另一个你正在为指针int_ptr(地址)分配一个int值5,所以就像你将5分配为指针int_ptr的地址

    【讨论】:

      【解决方案4】:

      在 C 中,pointers 指向地址本身。 & 运算符的地址是变量的地址。

      所以在:

      int int_var = 5;
      int *int_ptr = &int_var;
      

      *int_ptr 将被正确使用,因为它指向 int_var 的 ADDRESS,其值为 5

      但是在:

      int int_var = 5;
      int *int_ptr = int_var;
      

      *int_ptr 指向的地址是 5,而不是值 5 所在的地址,它应该是一些随机数。

      另外关于数组:

      char *y;
      char x[100];
      y = x;
      

      这是可以做到的,因为数组实际上是一个地址。

      For more information.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 2014-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-27
        • 1970-01-01
        相关资源
        最近更新 更多