我在下面提到了三个不同的例子。我不明白为什么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)(^ _^)来计算星星 现在一切都很清楚......感谢所有你的答案
答案 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值。