【问题标题】:What's the difference between a pointer, and a pointer variable?指针和指针变量有什么区别?
【发布时间】:2013-07-12 15:44:51
【问题描述】:

我知道这是非常基本的,但对我来说有点困惑。
我读过:

指针只不过是一个地址,而指针变量只是一个可以存储地址的变量.
当我们将变量i 的地址存储在指针变量p 中时,我们说p 指向 i

int i, *p = &i;

p 指向i

为了访问指针指向的对象,我们使用*(间接)运算符。

如果p 是一个指针,那么*p 代表p 当前指向的对象。

现在我很困惑我应该怎么称呼p -- pointerpointer variable

补充:指针总是和地址一样吗?

【问题讨论】:

  • 阅读 "What does “dereferencing” a pointer mean?" 可能会有所帮助,当然来自 wiki:"Pointer (computer programming)"
  • @GrijeshChauhan;在问这个问题之前,我已经阅读了第一个链接:)。感谢您提供第二个链接。
  • @GrijeshChauhan;感谢您的维基链接。它以一种非常优美的方式解释了取消引用。(实际上,如果您没有提供该链接,这就是我的下一个问题 :))。
  • 通常最好(至少作为初学者)将这些类型的声明分成多行。即int i, *p = &i; 等价于int i; int *p = &i;

标签: c function-pointers


【解决方案1】:

标记p 是一个指针变量,它指向一个变量i。我们可以简单地称它为指针。

声明:

int* p;
int i;
p = &i; 

p 声明为int 类型对象的标识符。这通常更简洁地表述为'p is a pointer to i'p 可用于在表达式 p = &i 之后引用 int 变量 i。要使用指针p 访问变量i 的值,您可以使用取消引用运算符*(例如*p)。而i = 10; 等价于*p = 10;

另外,注意在表达式p = &i; 中读取i 的地址,我使用了& 和号运算符,也称为Address of operand

指针只是一个逻辑地址(可以引用变量的标识符)。 C 标准没有定义指针在内部是什么以及它在内部如何工作。

您想阅读:What exactly is a C pointer if not a memory address?
此外,请阅读:to Understand the purpose of pointers.

【讨论】:

  • 但据说指针无非是地址
  • 是的。给我一点时间,我正在经历它。
  • @hacks 欢迎您,是的,乔纳森是个了不起的人!我读了很多他的回答。
【解决方案2】:

术语指针和指针变量经常作为同义词使用。

【讨论】:

    【解决方案3】:

    变量是存储值的地方。在 C 中,每当您在需要值的上下文中使用变量时,都会检索该变量的值,因此在该上下文中说“p”与说“变量 p 的值”是一样的:

    int *q = p;  // Copy the value of variable p into the variable q.
                 // aka: copy p into q.
    

    【讨论】:

      【解决方案4】:

      指针值和指针变量的区别如下:

      int swap_int(int *i1, int *i2)
      {
          int t = *i1;
          *i1 = *i2;
          *i2 = t;
      }
      
      int main(void)
      {
          int  v1 = 0;
          int  v2 = 37;
          int *p2 = &v2;
          printf("v1 = %d, v2 = %d\n", v1, v2);
          swap_int(&v1, p2);
          printf("v1 = %d, v2 = %d\n", v1, v2);
          return 0;
      }
      

      这里,p2是一个指针变量;它是指向int 的指针。另一方面,在对swap_int() 的调用中,参数&v1 是一个指针值,但它绝不是一个指针变量(在调用函数中)。它是一个指向变量的指针(该变量是v1),但简单地写&v1 并不是创建指针变量。在被调用函数内部,指针&v1的值被赋值给了局部指针变量i1,指针变量p2的值被赋值给了局部指针变量i2,但这不一样话说&v1是一个指针变量(因为它不是指针变量;它只是一个指针值)。

      但是,出于许多目的,这种区别是模糊的。人们会说'p2 是一个指针',这是真的;它是一个指针变量,它的值是一个指针值,*p2p2指向的对象的值。你会得到同样的模糊 'v1 is an int';它实际上是一个int 变量,它的值是一个int 值。

      【讨论】:

      • 而且 AFAIK 标准甚至不使用术语“变量”。
      • @hacks 不,当我写“变量”时,我的意思是“变量”。
      • @hacks "pointer-to-T",其中 "T" 是一种类型。 “对象”用于变量 IIRC,但您可以查看当前或以前的 C 标准(分别为 C11 和 C99),它们可在 Internet 上免费获得。
      • 我会说'是的:一个有效的指针总是某个对象或函数的地址;空指针无效但可识别;其他无效指针使用起来很危险——即使在不取消引用的情况下读取它们也可能会导致某些(主要是大型机)系统出现问题。
      • @H2CO3:在第 5.1.2.3 节中,一些非规范(示例)文本说 抽象机 [必须] 将每个变量的值提升为 int 大小,然后添加两个ints 并截断总和。 在第 6 节(语言的主要定义)中还有一些对变量的非规范性引用,但主要内容设法避免使用术语变量,除了可变长度数组和可变参数列表,两者都不重要。
      【解决方案5】:

      让我们将“指针”一词替换为希望更熟悉的数据类型,例如int

      int n = 42;
      

      这里的 42 是一个 int 值,n 是一个包含 int 的变量。您可以将n 称为“int 变量”。 int 是 42 或 -25315685 之类的数字,int 变量保存这些数字。一旦你有了一个变量,你就可以给它分配不同的数字。到目前为止没有什么令人困惑的事情吗?

      指针 就像一个 int:一个数字。它恰好是一个标识内存位置的数字,如果在该内存位置存储了某些内容,则可以将其称为地址。与 int 一样,指针可以存储在变量中。存储指针的变量可以称为指针变量。

      那么,指针和指针变量有什么区别?第一个是一个值,就像一个数字,第二个存储这些值。但是人们通常通过他们存储的值来引用变量。人们不会将n 称为“int 变量”,而只是将int 称为,即使它可以在不同的时间存储不同的ints。在本文中,当我指的是指针变量时,我会做同样的事情,有时会写指针;希望区别会很清楚。

      指针总是地址吗?这是一个关于“地址”这个词的含义的问题。从某种意义上说,指针始终是地址,它以一种或另一种方式对应于内存位置,它是该内存位置的“地址”。但另一方面,如果程序无法访问该内存位置或其中没有存储任何有用的东西,那么它真的是任何东西的“地址”吗?

      现在让我们研究以下代码:

      int *p;
      p = &n;
      

      第一行声明了一个名为p 的指针变量。可以存储到p 中的指针是int 数据的内存位置;这很重要,原因我们稍后会看到。我们仍然不给p 任何值,所以它存储的指针是任意的。它当然不会存储任何有用的地址;它甚至可能指向程序无法访问的内存区域。

      在第二行中,我们使用& 运算符获取n 变量的地址,并将其分配给p。现在p 存储了n 的地址,即存储n 值的内存位置。

      我们可以用指针做什么?我们可以读取和写入指针标识的内存位置。为此,我们使用*-运算符“取消引用”指针,然后可以像使用n 一样使用(*p)。例如,您可以使用以下命令将新值写入n

      *p = 123;
      

      在这一点上,为什么我们需要知道p 可以指向的数据类型变得很明显:否则您无法知道可以分配给(*p) 的数据类型。

      知道p 可以指向的数据类型很重要的另一个原因是指针算法。例如p+1 是一个指向int 的指针,存储在内存中n 之后;如果p 是指向大数据结构的指针,p+1 将是指向紧随其后存储的相同类型的数据结构的指针。为此,编译器必须知道指针指向的大小。

      【讨论】:

      • 感谢您解释另外一个(但我没有完全理解您的解释)+1。
      • 您觉得哪些部分难以理解?
      • 您的调查部分非常好,它帮助我理解了一些优点,但它不是针对我的问题的; 指针总是地址吗?
      • 嗯,这取决于“地址”的含义,但我会说不。想象一下,您正在为现代计算机编写程序:该程序向操作系统请求一些内存。唯一有效的地址是操作系统返回的内存,但您可以在指针中存储更多值。或者想象一个没有操作系统的嵌入式系统。唯一有效的地址是实际安装的内存,它通常是不同指针值数量的一小部分。指针并不总是有效的地址。
      【解决方案6】:

      指针:一个变量,其值为另一个变量的地址。

      指针变量:包含存储另一个变量、数据值或函数的内存位置或地址。

      【讨论】:

      • 你可能想说“指针:另一个变量的地址”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多