【问题标题】:Basic Pointers in C?C中的基本指针?
【发布时间】:2012-03-16 16:53:48
【问题描述】:

我在下面提到了三个不同的示例。我不明白为什么 ex1 对 ex2 有相同的输出而对 ex3 有不同的输出,还有为什么 ex2 与 ex3 不一样,我只是在另一行创建!

ex1

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int x=2;
    int *y;
    y = &x;
    printf("value: %d\n", *y);
    printf("address: %d\n", y);
    return EXIT_SUCCESS;
}

输出

value: 2
address: 2686744

ex2

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int x=2;
    int *y = &x;
    printf("value: %d\n", *y);
    printf("address: %d\n", y);
    return EXIT_SUCCESS;
}

输出

value: 2
address: 2686744

ex3

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int x=2;
    int *y;
    *y = &x;
    printf("value: %d\n", *y);
    printf("address: %d\n", y);
    return EXIT_SUCCESS;
}

输出

value: 2686744
address: 2130567168

当我认为 STAR 必须与 (y) 而不是 (int) 时,我对指针有很大的误解 我用 (int) NOT (y) (^_^) 找出那颗星 现在一切都清楚了...感谢您的所有回答

【问题讨论】:

  • 调高你的编译器警告级别,你应该被告知问题...
  • ex3 无效。如果从未设置过y,则不能使用*y
  • 另外你应该养成在打印指针时使用%p的习惯,而不是%d。 (但对于像*y 这样的整数类型,仍然使用%d。)
  • @Oli Charlesworth 我想了解内存级别不是编译器所说的,这对我来说还不够。

标签: c pointers


【解决方案1】:

在示例 3 中,首先声明一个指针:

int *y;

然后你说*yint值就是x的地址。

那是因为有了 int *y 声明,你有:

  • yint * 类型
  • *y 的类型为 int

因此,示例 3 中正确的代码行应该是:

int *y;
y = &x;

【讨论】:

  • 感谢您的回答。所以我必须给 x 的 y 地址,但如果我不这样做,编译器会给 y 分配一个随机值。我的解释正确吗?
  • 不,这不是随机值。使用*y = &amp;x,您将获得x 地址的整数表示形式。
  • 在我打印 y 时在 ex3 中。为什么我得到这个值 2130567168?该值代表什么?
【解决方案2】:

嗯,让我们把所有东西都放在一条线上:

int *y
ex1:    y = &x
ex2:    y = &x
ex3: (*y) = &x

Ex3 与其他两个不同。

Ex3 将值 (&x) 赋给指针 y 指向的值。

【讨论】:

  • 感谢您的回答。所以如果我写“int *y = &x;”那就是y的平均值是x的地址。对吗?
  • @thalsharif:基本上是的,但这只有在 y 是 int** 类型时才有效,并且 y 确实指向某些东西(它没有)
【解决方案3】:
*y

用于知道y指向的地址的内容

【讨论】:

    【解决方案4】:

    int *y; *y = &amp;x;int *y = &amp;x; 不同。在前者中,您将y 指向的内存位置的内容设置为x 的地址。而在后者中,您将指针y 初始化为x 的地址。因此,如果您从 *y = &amp;x 中删除 *,您将看到与 ex1 和 ex2 相同的输出。

    【讨论】:

      【解决方案5】:

      在 ex3 上,*y = &amp;x; 表示您将在y 指向的内存块中存储x 的地址。这是一个问题,因为y 实际上并没有指向任何东西。

      无论printf("address: %d\n", y); 打印什么,都不是有用的信息。

      【讨论】:

        【解决方案6】:

        因为第三个例子是*y =而不是y =

        【讨论】:

          【解决方案7】:

          在声明类型时,* 表示“指针”。之后,它是一个取消引用运算符。考虑:

          int x=2;
          int *y;
          y=&x;
          *y = x;
          

          这适用于为地址分配地址、值的值。但是,取消引用运算符会为您提供内容,因此 *y=x 不会持续超出范围。你应该把它当作临时的。这就是为什么如果将 *y 传递给函数并对其进行修改,则在打印 *y 时将看不到修改。您必须将 y 传入,即“通过引用传递”。简而言之,&*y=&x 是不稳定的,并不等同于 y=&x。

          查看 C 中的左值和右值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-20
            • 1970-01-01
            • 2016-04-24
            • 2011-08-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多