C中的基本指针?

时间:2012-03-16 16:53:49

标签: c pointers

我在下面提到了三个不同的例子。我不明白为什么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

当我认为明星必须成为(y)NOT(int)时,我有很多误解的指针 我用(int)NOT(y)(^ _^)来计算星星 现在一切都很清楚......感谢所有你的答案

7 个答案:

答案 0 :(得分:5)

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

int *y;

然后你说int的{​​{1}}值是*y的地址。

那是因为声明x你有:

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

因此,示例3中的右侧代码应为:

int

答案 1 :(得分:2)

嗯,让我们把所有东西都放在一行:

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

Ex3与其他两个不同。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

*y

用于了解y

指向的地址的内容

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

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

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

只要为地址分配地址,值值,这是合适的。但是,取消引用运算符会为您提供内容,因此* y = x不会超出范围。你应该像临时一样对待它。这就是为什么如果你将* y传递给一个函数并修改它,你打印* y时就不会看到修改。你必须传入y,即“通过引用传递”。简而言之,&amp; * y =&amp; x是不稳定的,并不等同于y =&amp; x。

参见C中的l值和r值。