2017-10-28 21 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을 얻습니다. 그것의 내용, * = 당신은 또한 x 인 ptr의 내용을 다시 얻는다. 마지막으로 * ptr에 2를 곱하면 * ptr은 다시 x 내용이됩니다. –

+2

'* ptr '이 무엇인지 이해하면 아마도'2 * * ptr '이 의미있는 형식인지 이해할 수있을 것입니다. (두 번''* ptr'입니다.) – Ryan

+1

이러한 수치는 유용합니다. [포인터의 "역 참조"는 무엇을 의미합니까?] (https://stackoverflow.com/questions/4955198/what-does-dereferencing-a-pointer -mean) 및 [참조 및 의미없는 참조]의 의미 (https://stackoverflow.com/questions/14224831/meaning-of-referencing-and-dereferencing) –

답변

30

여기서, *& 연산자는 차례로 사용되면 서로의 효과를 취소합니다.

**&ptr*ptr과 같으며 여기서 ptrx 변수의 주소를 보유합니다. 따라서 여기에 x의 값을 인쇄하십시오.

2**ptr2 * (*ptr)으로 해석됩니다. 따라서 2 * (10)20과 같습니다.

9
**&ptr 

&*과는 서로 대향 한 의미를 가지고 단항 연산자이다.

&(lvalue)

방법에 대한 역 참조 알기 위해, 좌변의 유형을 고려, 좌변가 가리키는 주소 값을 반환하기 위해 해당 lvalue *(lvalue) 동안 수단의 주소를 반환하는 것을 의미합니다.

육안 이러한 연산자의 의미는 ( emacsartist-mode 내 재능이 너무 큰되지 않습니다) 다음과 같습니다 : 나는 상자 안에 올바른 값을 표시

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

주 박스 외부의 주소 동안 해당 메모리 위치의 왼쪽 값을 메모리에 저장합니다.

이제 *&(lvalue)을 쓸 때 lvalue의 주소에서 값을 얻으려는 것을 의미하며 이는 곧 lvalue으로 작성됩니다.

그래서 **&ptr*ptr 의미 - 정수로 역 참조 PTR로 ADRESS 포인터에서, 즉 값을, 당신의 케이스 (10)


2**ptr 

을에 렉서가 토큰 및 파서의 코드를 분할합니다 그런 나무 구축 할 것입니다 :이 경우

(2) * (*ptr) 

하면 결과는 C에서, ptr의 ADRESS 2 배의 값이됩니다 ase 20.

+5

좋은 답변이지만 솔직히 말해서 그래프를 찾았습니다. 꽤 혼란스러워. 하나는 'ptr'이 두 번, 한 번 상자 안에, 한 번 밖에보고됩니다. 그리고 'x = 10'은 어디에도 없습니다. –

+0

@FabioTurati 상자 안의 값은 상자 밖의 왼쪽 값입니다. 대답은 추상적이지 콘크리트가 아니기 때문에 x = 10도 없습니다. – alinsoar

0

ptr은 포인터 변수입니다. 이 포인터 변수는 x 값이 저장된 메모리 위치를 가리 킵니다.* ptr은 포인터 변수가 가리키는 값에 액세스합니다.

이제 &은 C의 주소 연산자입니다. & ptr은 ptr의 주소를 반환합니다. 그래서 * & 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의 주소입니다. 그래서 **&ptrx의 값입니다.

printf("%d\n", 2**ptr); - 2 값을 ptr로 곱합니다. 그것은 2 * x