2017-10-28 151 views
8

我新手上C.我需要了解每个印刷在屏幕上的值的装置通过以下代码:C指针的“**&ptr”和“2 ** ptr”是什么意思?

#include<stdio.h> 

int main() 
{ 
    int x = 10; 
    int *ptr = &x; 
    printf("%d %d %d\n", *ptr,**&ptr, 2**ptr); 
    return 0; 
} 

输出(GCC):

10 10 20 

这里,我已声明变量xptr指向x变量。所以,*ptr的印刷值为x。但我无法理解**&ptr2**ptr的值。

在此先感谢。

+1

第一个10是ptr的内容(而ptr是x的adr)所以它是x的内容......第二个是你得到ptr的adr,* =你得到它的内容,* =你再次得到ptr的内容,这也是x。最后一个将* ptr乘以2和* ptr的内容再次是x的内容 –

+2

如果您了解了什么是* * ptr,那么您在理解格式时可能会明白'2 * * ptr'是什么。 (这是'* ptr'的两倍) – Ryan

+1

您可能会发现这些读数很有用[什么是“取消引用”指针?](https://stackoverflow.com/questions/4955198/what-does-dereferencing-a-pointer - 意思是“引用”和“取消引用”](https://stackoverflow.com/questions/14224831/meaning-of-referencing-and-dereferencing) –

回答

30

这里,*&运营商相互取消作用时,一个接一个地使用。

**&ptr*ptr相同,这里ptr保持地址为x变量。所以,在这里打印x的值。

2**ptr被解释为2 * (*ptr)。所以,2 * (10)等于20

9
**&ptr 

&*是具有与其它的相反的意思1一元运算符。

&(lvalue)表示返回相应的lvalue的地址,而*(lvalue)表示从左值指向的地址返回值,考虑左值的类型,以便知道如何解引用它。

目测这些操作符的含义是这样的(我在emacsartist-mode人才不是太大):

 +----------------+    
     | ptr = *&ptr |    
     +--------------+-+    
    /    \ 
    /    \ 
    &ptr     \ 
          +----------------+ 
          | *ptr  | 
          +----------------+ 
         /
         /
         ptr 

注意,标志着我盒内正确的价值,而方框外的地址的相应存储器位置的左值的存储器。

现在,当你写*&(lvalue)时,它意味着从左值的地址获得值,该值很快写入lvalue

所以**&ptr装置*ptr - 即从通过PTR的ADRESS指针的值,解除引用作为整数,在壳体10


2**ptr 

词法分析器将在令牌和解析器分裂代码将建立一个这样的树:

(2) * (*ptr) 

在这种情况下,结果将是从ptr的ADRESS 2倍的值,在你的c ase 20

+5

很好的答案,但说实话我找到你的图很混乱。首先,'ptr'报告两次,一次在盒子里,一次在外面。而且在任何地方都没有'x = 10'。 –

+0

@FabioTurati在盒子里面它是正确的值,在盒子外面是左边的值。没有x = 10的答案是抽象的,而不是具体的。 – alinsoar

0

ptr是一个指针变量。该指针变量将指向存储x值的内存位置。* ptr将访问指针变量指向的值。

现在&是C中的一个地址操作符。& ptr返回ptr的地址。 So * & ptr从ptr的地址返回值。所以*和&将相互无效。那是ptr和* & ptr是一样的。

ptr = *&ptr => *ptr = **&ptr 因此,值是10。

2 **的ptr只不过是2 *(* PTR)。因此,该值为20.

+0

“*'* ptr'是一个指针变量。*”没有。 'ptr'是指针可变的。正如你正确地提到的那样:'* ptr'是解引用指针'ptr'。所以实际上'* ptr'评估为一个'int'。 – alk

2

int *ptr指向int x。

printf("%d\n", *ptr);表示 - 取值prt分。所以* ptr是x的值。

printf("%d\n", **&ptr); - & ptr是指针的地址,*&ptrptr中的值。并且&ptr的值是x的地址。所以**&ptr是值x

printf("%d\n", 2**ptr); - 2乘以ptr值。它的意思是2 * x

相关问题