C指针的“**&ptr”和“2**ptr”是什么意思?
What is the meaning of "**&ptr" and "2**ptr" of C pointer?
我是C新手,需要通过以下代码了解屏幕上打印的每个值的含义:
#include<stdio.h>
int main()
{
int x = 10;
int *ptr = &x;
printf("%d %d %d\n", *ptr,**&ptr, 2**ptr);
return 0;
}
输出(海湾合作委员会):
10 10 20
在这里,我声明了变量x
并且ptr
指向x
变量。因此,*ptr
打印了 x
的值。但是我看不懂**&ptr
和2**ptr
的值。
提前致谢。
这里,*
和&
运算符在依次使用时相互抵消。
**&ptr
与 *ptr
相同,这里 ptr
保存 x
变量的地址。所以,在这里打印 x
的值。
2**ptr
被解释为 2 * (*ptr)
。所以,2 * (10)
等于 20
.
**&ptr
&
和 *
是一元运算符,它们具有相反的含义 1。
&(lvalue)
表示return相应lvalue
的地址,而*(lvalue)
表示return左值指向的地址的值,考虑左值的类型,以便了解如何取消引用它。
这些运算符的含义直观看起来是这样的(我在emacs
的artist-mode
方面的天赋不算太大):
+----------------+
| ptr = *&ptr |
+--------------+-+
/ \
/ \
&ptr \
+----------------+
| *ptr |
+----------------+
/
/
ptr
注意我在方框内标注了右边的值,而在方框外标注了对应内存位置的左边值的内存地址。
现在写*&(lvalue)
的意思是从左值的地址取值,写的很短lvalue
.
所以 **&ptr
表示 *ptr
—— 即来自 ptr 的地址指针的值,在你的例子中被取消引用为整数,在你的例子中是 10.
2**ptr
词法分析器将代码拆分为标记,解析器将构建这样的树:
(2) * (*ptr)
在这种情况下,结果将是 ptr
地址值的 2 倍,在您的情况下 20
.
ptr 是一个指针变量。该指针变量将指向存储 x 值的内存位置。 *ptr 将访问指针变量指向的值。
现在 & 是 C 中的地址运算符。 &ptr returns ptr 的地址。
所以 *&ptr returns 来自 ptr 地址的值。所以 * 和 & 会互相抵消。即 ptr 和 *&ptr 是一回事。
ptr = *&ptr => *ptr = **&ptr
因此值为 10.
2**ptr 只不过是 2 * (*ptr)。因此值为 20.
int *ptr
指向 int x。
printf("%d\n", *ptr);
表示 - 在 prt
点处取值。所以 *ptr 是 x
值。
printf("%d\n", **&ptr);
- &ptr 是指针的地址,*&ptr
是ptr
中的值。 &ptr
的值是 x
的地址。所以 **&ptr
是 x
的值
printf("%d\n", 2**ptr);
- 2 乘以 ptr 中的值。意思是 2*x
我是C新手,需要通过以下代码了解屏幕上打印的每个值的含义:
#include<stdio.h>
int main()
{
int x = 10;
int *ptr = &x;
printf("%d %d %d\n", *ptr,**&ptr, 2**ptr);
return 0;
}
输出(海湾合作委员会):
10 10 20
在这里,我声明了变量x
并且ptr
指向x
变量。因此,*ptr
打印了 x
的值。但是我看不懂**&ptr
和2**ptr
的值。
提前致谢。
这里,*
和&
运算符在依次使用时相互抵消。
**&ptr
与 *ptr
相同,这里 ptr
保存 x
变量的地址。所以,在这里打印 x
的值。
2**ptr
被解释为 2 * (*ptr)
。所以,2 * (10)
等于 20
.
**&ptr
&
和 *
是一元运算符,它们具有相反的含义 1。
&(lvalue)
表示return相应lvalue
的地址,而*(lvalue)
表示return左值指向的地址的值,考虑左值的类型,以便了解如何取消引用它。
这些运算符的含义直观看起来是这样的(我在emacs
的artist-mode
方面的天赋不算太大):
+----------------+
| ptr = *&ptr |
+--------------+-+
/ \
/ \
&ptr \
+----------------+
| *ptr |
+----------------+
/
/
ptr
注意我在方框内标注了右边的值,而在方框外标注了对应内存位置的左边值的内存地址。
现在写*&(lvalue)
的意思是从左值的地址取值,写的很短lvalue
.
所以 **&ptr
表示 *ptr
—— 即来自 ptr 的地址指针的值,在你的例子中被取消引用为整数,在你的例子中是 10.
2**ptr
词法分析器将代码拆分为标记,解析器将构建这样的树:
(2) * (*ptr)
在这种情况下,结果将是 ptr
地址值的 2 倍,在您的情况下 20
.
ptr 是一个指针变量。该指针变量将指向存储 x 值的内存位置。 *ptr 将访问指针变量指向的值。
现在 & 是 C 中的地址运算符。 &ptr returns ptr 的地址。 所以 *&ptr returns 来自 ptr 地址的值。所以 * 和 & 会互相抵消。即 ptr 和 *&ptr 是一回事。
ptr = *&ptr => *ptr = **&ptr
因此值为 10.
2**ptr 只不过是 2 * (*ptr)。因此值为 20.
int *ptr
指向 int x。
printf("%d\n", *ptr);
表示 - 在 prt
点处取值。所以 *ptr 是 x
值。
printf("%d\n", **&ptr);
- &ptr 是指针的地址,*&ptr
是ptr
中的值。 &ptr
的值是 x
的地址。所以 **&ptr
是 x
printf("%d\n", 2**ptr);
- 2 乘以 ptr 中的值。意思是 2*x