0

假设我在 C 中有以下代码:

int x = 1025;
int *y = &x;
  1. &y是什么?它是指针变量 y 在内存中的地址吗?
  2. 指针变量 y 是什么?它是否保存变量 x 的地址?
  3. &x 是什么?是变量 x 本身在内存中的地址还是它的值 1025 的地址?
  4. 什么是变量 x?是它的值的地址,1025?
  5. 什么是*y?是 1025 = variable x 的地址吗?

还有那个大...

如果打印 &y 显示 y 的地址,打印 &x 显示 x 的地址,但打印 x/*y 只是打印 1025,我将如何打印 1025 的地址?

抱歉,如果其中一些问题看起来真的很明显,但我对我试图澄清的指针有很多困惑。

[编辑] 伙计们,我发现了我的错误;我在想变量 x 将保存代表 1025 的字节序列的地址。标准的 Java-to-C 失调。谢谢大家的回复

4

6 回答 6

3

鉴于:

int x = 1025;
int *y = &x;

Q1。是什么&y?它是指针变量在内存中的地址y吗?

是的。它是变量的地址y,并且具有类型int **

Q2。什么是指针变量y?它是否保存变量的地址x

是的。它是一个指针变量,(在代码片段之后)保存x.

Q3。是什么&x?是变量x本身在内存中的地址还是它的值的地址,1025?

它是变量的地址x。碰巧x此时持有 1025,但是当该值更改时,&x仍然指向变量x,因此指向当前值x而不是 1025 (因为x现在包含不同的值)。

Q4。变量是什么x?是它的值的地址,1025?

该变量x是当前保存值 1025 的内存位置,但这可能会改变。像 1025 这样的值本身没有地址——这是来自 OO 语言的概念(我认为 Smalltalk 有这种概念;我认为 Java 将它用于对象类型,而不是像‡</sup>这样的简单非对象类型int) 而不是 C 概念。

Q5。是什么*y?是 1025 = variable 的地址x吗?

不是1025的地址;这是容易的部分。如果使用int i = *y;,则是指向*y的变量中的值,即当前,当前值为 1025,因此设置为 1025。但是,如果使用,则是指向的变量,即,所以存储在(and ) 中的值从 1025 变为 1024。yxi*y = 1024;*yyxx*y

Q6。如果打印&y显示地址y,打印&x显示地址x,但打印x/*y只打印 1025,我将如何打印 1025 的地址?

前两个断言很好。'but' 断言需要在 the和 thex / *y之间写一个空格,否则你已经开始了评论。但是,这不应该打印 1025,而应该打印 1。如果你得到 1025,那么你写了如下内容:/*

printf("%d\n", x/*y);  /* comment */);

1025 本身没有地址。当前保存值 1025 的各种变量可能有各种地址,但值 1025 没有单个地址。如前所述,这是一个非 C 概念。

‡ 如果有人不同意 Java 或 Smalltalk 引用,请通过评论告诉我,我将删除那些错误的。它们不是我论证的关键部分——我只是想解释一些语言确实有一个类似于“地址1025”的概念,尽管 C 没有。

于 2013-09-07T20:41:14.963 回答
2

&y是什么?它是指针变量 y 在内存中的地址吗?

是的。您也可以拥有指向指针的指针。

int x = 357;
int *y = &x;
int **z = &y;

指针变量 y 是什么?它是否保存变量 x 的地址?

是的。基本上,它是一个整数类型,(作为它的值)保存“x”的地址。

&x 是什么?是变量 x 本身在内存中的地址还是它的值 1025 的地址?

变量的地址,它是一个整数,也是存储值的地方。

什么是变量 x?是它的值的地址,1025?

它是存储数据的几个字节的内存位置。如何解释数据取决于使用它的代码。对于整数,数据旨在表示一个数字(如 1025),但它可以像其他东西一样容易地被操纵,如几个字符或浮点数。内存中的数据仅仅是内存中的数据——赋予它意义的是它的使用方式。

什么是*y?是 1025 = variable x 的地址吗?

1025只是存储在'x'地址的数据,存储在这些内存字节中的值根本不会改变'x'的位置。一旦创建了“x”,它在内存中的位置(在其生命周期内)就不会改变。

所以 *y 是 x。*y “取消引用”存储在“y”(x 的地址)中的地址,因此您正在对“x”和“*y”都引用的内存块进行操作。

如果打印 &y 显示 y 的地址,打印 &x 显示 x 的地址,但打印 x/*y 只是打印 1025,我将如何打印 1025 的地址?

打印 x/*y 应该打印x = 1025. *y = 1025. 1025/1025 = 1 1。1025 没有地址。1025 是某处几个字节中的一堆位。1025 是存储在几个字节中的位序列(您的代码赋予其含义,但它本身没有意义)位于存储在“x”和“*y”中的地址处。

如果我们假设一个整数是四个字节的内存(比方说 32 位操作系统和硬件),那么您在 RAM 中的某个随机位置有四个字节:

[01000100] [1101010] [00101001] [11010101] (gibbish binary for illustration)

存储在这四个字节中的二进制位并不意味着什么,直到您的代码决定如何解释这些位的含义。

'x'这四个字节。1025 被转换为二进制并存储在这四个字节中。“x”的地址就是这四个字节的地址。'y' 是存储 'x' 的地址的一大块字节。'*y' 允许您对 'y' 存储地址的字节进行操作。访问 *y 会给出指向 x 所指的相同字节。

于 2013-09-07T20:33:21.033 回答
1

&y是什么?它是指针变量 y 在内存中的地址吗?

是的。

指针变量 y 是什么?它是否保存变量 x 的地址?

是的。

&x 是什么?是变量 x 本身在内存中的地址还是它的值 1025 的地址?

这是x的地址。x 可以更改,例如,如果您在后面的行中使用 'x = 1024' 设置它,但它的地址将保持不变

什么是变量 x?是它的值的地址,1025?

x 是一个变量,这意味着它占用了内存中的一些空间,并且该空间中的位具有整数值 1025。

什么是*y?是 1025 = variable x 的地址吗?

* y 取消引用指针,这意味着它获取该地址的内存值。所以它返回 1025。

您的“大问题”只是问题#3。

于 2013-09-07T20:30:41.100 回答
1
  1. &y是什么?它是指针变量 y 在内存中的地址吗?

    &y是存储变量y内容的地址,这些内容是(指向)an 的地址int

  2. 指针变量 y 是什么?它是否保存变量 x 的地址?

    是的,y是一个保存变量地址的指针x

  3. &x 是什么?是变量 x 本身在内存中的地址还是它的值 1025 的地址?

    &x是 的地址x,因此是变量本身在内存中的地址,而不是您初始化它的常量值。

  4. 什么是变量 x?是它的值的地址,1025?

    变量本身只是内存中的一个存储区域,在 C 语言中是一个“对象”。在内部,编译器使用名称来查找该存储区域的地址。

  5. 什么是*y?是 1025 = variable x 的地址吗?

    *y是任何y指向的值,在本例中为 1025。

  6. 我将如何打印 1025 的地址?

    由于各种原因,包括它可能没有地址,在 C 中获取文字常量的地址(字符串文字除外)是不合法的。

于 2013-09-07T20:31:49.670 回答
0

是的,是的,地址(这就是为什么&称为“地址”运算符的原因),不,不。

以下是您应该如何看待 C 中的变量。它们是可以在上面写值的纸片。(值的类型应与纸上注明的类型相匹配。)所有纸片都装订在一个笔记本中,以便您可以通过页码对其进行寻址,我们称之为地址。

指针变量是写页码的特殊纸张。您可以稍后检查指针,查看它指向哪张纸,然后查看它。

由此得出:

  1. 变量有一个地址。这是一张带有页码的纸。
  2. 值没有地址。它不是一张纸,它就像一个数字,你可以写一张纸上。像 1025 这样的数字没有页码,但是当您在调用的页面上写上“1025”时x,就会有一个带有页码的页面,上面写着 1025。

要说服自己不能获取值的地址,请尝试类似&1025. 编译器不允许这样做。

于 2013-09-07T20:28:19.993 回答
0
  1. 确切地。指针是一个变量,作为一个变量有它自己的内存地址。

  2. 是的,指针 y 用变量 x 的地址初始化

  3. &x 是变量 x 的地址。如果您想清楚地看到差异,您可以打印它。

  4. 变量 x 保存在内存中的某个地址。这与初始化变量的值不同,在本例中为 1025。

同样,要查看差异,请尝试打印出 x 的地址及其值:

int x = 1025;
printf("%p", &x); //prints the address of x
printf("%d", x); //prints the value assigned to x

最后一个问题:*y是变量指针和解引用运算符*,这意味着你得到了保存在y指向的变量中的值。

那么实际上如果你打印 x/(*y) 那么你应该得到 1 因为你会得到 1025/1025

于 2013-09-07T21:07:35.030 回答