【问题标题】:How &a is a pointer to a if it generates the address of a?如果 &a 生成 a 的地址,它如何是指向 a 的指针?
【发布时间】:2014-10-29 14:56:45
【问题描述】:

我是编程新手,目前正在学习 C 中的指针。

  1. 我知道指针是包含或保存另一个变量地址的变量。今天,当我通过 K&R 进一步了解它时,我对第 80 页的给定函数 swap(&a,&b) 中的“&a 是指向 a 的指针”的一行感到困惑。&a 如何是指针?它不是变量,它是变量的地址。我说的对吗?
  2. 我知道参数可以通过两种方式传递给函数:按值调用和按引用调用。调用者的参数值在第一个中没有更改,但在第二个中可以更改。

我的问题是我已经读过,如果我们想更改变量的值,我们必须将指针传递给它(即我们要修改的值的位置)。这是什么意思?我的意思是,我们必须将指针传递给函数吗?语句的含义是什么,“我们必须将指针传递到我们要修改的位置”。

【问题讨论】:

  • 有些人用“指针”表示“指针变量”。特别是“...指针是变量”只有在您使用“指针”作为“指针变量”的简写时才成立。任何 表达式 都可以是指针类型。 &a 是一个表达式(它有一个指针类型)。

标签: c pointers memory-address


【解决方案1】:

指针不是变量。指针是一个

C 中的变量指定一个存储位置,并且可以在该位置存储一个值。因此,如果您有一个用int a 声明的变量a,那么a 是一个可以存储整数值的变量。如果您有一个变量int *x,那么x 是一个变量,其中可以存储一个指向整数值的指针

可以使用& 运算符获取存储位置的地址。例如,&aa 指定的存储位置的地址,或a地址,并且可以存储在(除其他外)相应类型的变量中。因此,您可以:

int  a = 42;  /* a is a variable of type int,  and has value 42 */
int* x = &a;  /* x is a variable of type int*, and has value &a */

尽管编程中的类比通常很危险,但您可能会想到诸如书中的页码之类的东西。页面的页码与页面不同,但页码仍然可以写在页面上。例如,目录页上有很多页码写在上面。因此:

actual_page p = ...; /* a page structure */
page_number n = &p;  /* a page number    */

【讨论】:

  • 非常感谢您的出色回答。据我所知,指针和指针变量是两个不同的东西,对吗?最后一个问题,如果指针是变量的地址,那么为什么在某些书中,例如 K.N King 在某个地方说 p 是指向 i 的指针(例如)。作者是否使用指针代替了指针变量?
  • @user4156958 是的,说 p 是指向 i 的指针是滥用语言;实际上 p 的 value 是指向 i 的指针。这在技术上有点不准确,但它是非常通用的语言,因为上下文通常可以清楚地说明什么意思。由于指针变量不是指针,如果我们说“p [a pointer variable] 是指向 i 的指针”,我们实际上必须是指“[o 的值] 是指针 i”。就像当我们说(在int a=2 之后)a 是 2 时,我们实际上的意思是 a 的 是 2。
【解决方案2】:

指针地址。 指针变量是一个保存地址的变量。

这可能类似于文字整数1 和整数变量int a 之间的区别。人们可能会将a1 称为整数,就像您可能将&aint* p 称为指针一样。

还要注意&a 不是一个左值 并且不能被赋值 - 所以正如你所说的不是一个变量,但它仍然是一个指针,并且本身可以赋值给一个指针变量。

【讨论】:

  • 那么指针和指针变量是两个不同的东西?指针变量保存指针对吗?
  • @user4156958:是的。指针变量是保存指针值(地址)的变量,就像整数变量是保存整数值的变量一样。两者都有类型 - 指针类型 可以引用值或变量。 &a 其中int 中的a 具有int* const 类型,并且是值而不是变量。
  • 好吧,我想说它对我有很大帮助。我想在很多书中我看到作者说“p 是指向 i 的指针”(例如)这意味着什么.它们是指指针变量还是指针?
  • @user4156958 不幸的是,使用这种语言的人用这种语言折腾的白话是如此人手不足。事实上,很多时候你看到人们说“指针”时他们真正的意思是“地址”。语言标准通过使用诸如“返回类型为“指针类型”的值等术语来相当大的篇幅来避免这种混淆,但是在解析由大多数 C 程序员。我只能希望它最终能凝胶化(希望比其他试图回答这个问题的人明显更好)。
  • @Clifford 和我勾选了这个,但我觉得如果你扩展 OP 关于参数的问题的第二部分,它会跳到投票领先的位置,深入了解在 C 中的简单事实所有参数都是按值传递的,并且必须为意图从调用者修改某些内容的函数提供一个允许它这样做的“值”;即作为形式参数传递的地址,声明为“指针类型”。无论如何 +1。
【解决方案3】:

如果a 是某种类型的变量T,那么&a 是一个表达式,计算结果为该变量的地址,也称为指向该变量的指针——这些术语可以互换。 &a 的类型为 T*,读作“指向 T 的指针”。

int x = 4;   // 4 has type int, so we can assign it to an int variable.
int *p = &x; // &x has type int*, so we can assign it to an int* variable.

您可以修改通过指针传递的函数参数的原因是指针为变量引入了一种别名。您可以直接(通过变量)或间接(通过指针)从多个位置更改它。

// modifying x modifies *p.
++x;
printf("%d %d\n", x, *p);

// modifying *p modifies x.
++*p;
printf("%d %d\n", x, *p);

【讨论】:

  • 感谢您的精彩回答 :) 据我所知,指针和指针变量是两个不同的东西。指针变量指向指针或指针变量指向指针对象。对吧?是的,指针是变量地址。
  • @user4156958:指针(值)和指针变量是不同的,是的。您将指针值存储在指针变量中。假设我们有几个盒子的“记忆”,#1、#2、#3 等等。我们调用#1 x 并将4 存储在其中。 &x 是“x 所在框的编号”,#1。所以我们调用#2 p 并将1 存储在其中。使用p,我们现在可以查找并更改x 的值—*p 是“框号p 处的值”。此外,我们可以在框#3 中创建一个变量int **pp,并将&p (2) 分配给它。然后我们可以通过修改*pp来修改p,或者通过修改**pp来修改x
【解决方案4】:

正如其他人所观察到的,指针是一种特殊的,而不是一种特殊的变量。

关于调用函数:

  1. 您不能在 C 中“将变量传递给函数”。如果您将变量名放在函数调用的参数列表中,则传递存储在该变量中的 ,不是变量本身。

  2. 虽然一般意义上的编程语言可以提供按值或按引用传递函数参数,但 C 提供按值传递。但是,您可以通过将指针(值)传递到存储另一个值的位置来模拟 C 中的引用传递。这就是swap(&a, &b) 所做的事情:您正在传递变量ab 的值的存储位置(即指向这些值的指针)。

【讨论】:

    【解决方案5】:
    1. 指针包含地址 - 所以同义。
    2. 当你通过引用传递时,你是在传递地址——直接修改值。

    【讨论】:

    • 从技术上讲,传递指针不是通过引用传递。
    • @ScottHunter:之前,OP 正确地在括号中提到了address,例如指针(地址)。不知道,这种混乱是怎么来的。我只是出于这个原因投票。
    • @ScottHunter 两者有何不同。那么黑白指针和引用有什么区别吗?正如上面的答案所说,地址和指针是同义词
    • 通过引用传递,参数将是有问题的变量,编译器/解释器将处理引用(看看 C++ 是如何做到的)。在 C 中,传递和使用地址是显式的。
    • @user4156958 指针包含内存位置的地址。通常声明的变量(例如 int、double 等)的引用是变量的地址。在 Joshua Taylor 的回答中,“&a”是对变量“a”的引用。
    【解决方案6】:

    指针是一种存储对象地址的变量。

    基本上,指针就是地址。

    把它想象成一张纸。如果上面印有数字,则为integer(或其他数字类型)。
    指针是一张纸,上面写着“数据在位置 x 的纸上”,其中“位置 x”是对象的地址。

    【讨论】:

    • 如果指针是地址,那么为什么你写的指针是变量。你的意思是指针变量吗?
    • 如果你把一个变量看成是一个持有值的东西,那么指针持有一个指向另一个变量的值(地址),其中包含你感兴趣的值(你的数据)跨度>
    • 现在我再次对你写的回答感到困惑 poinyer 基本上是地址。地址如何存储任何值毕竟地址是一个值。
    【解决方案7】:

    如果 &a 生成 a 的地址,它怎么是指向 a 的指针?

    C 中的术语 pointeraddress 是同义词。

    创建变量时:

    int a = 0; 
    

    它在内存中的特定内存位置或地址处创建,具有足够的内存来容纳 1 int

    &a 不生成地址,它只是提供地址。

    & 运算符可用于将指针的地址设置为特定位置,例如:

    int a = 0;//a now exists in memory at a specific location;
    int *b = {0}; // b is created in memory as a pointer, and can be assigned a location
    
    b = &a; //b is assigned the location (address) of the variable a  
    

    稍有不同,在上一行中,& 被称为 address-of 运算符,因此:

    b = &x; 可读:将 a 的地址分配给 b(a 指针)。

    【讨论】:

    • &a 提供地址是什么意思?顺便说一句,谢谢你的回答:)
    • @user4156958 查看我的编辑...(但我认为 地址 说明得很好)
    猜你喜欢
    • 2013-08-24
    • 2010-11-30
    • 2011-01-05
    • 2015-07-12
    • 2022-01-25
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 2017-05-16
    相关资源
    最近更新 更多