2016-06-21 5 views
0

아래 구조체에서 'p'포인터에 포함 된 값이 잘못 인쇄되었으므로 올바른 인쇄 방법을 찾을 수 없습니다. 어떤 코드가 적합한가요? 코드 :구조체에서 포인터 값을 출력하는 방법

#include <stdio.h> 

struct my_struct{ //structure definition 
    int a,*p; 
}; 

int main(){ 

    my_struct var; 
    var.a = 5;     //variable definition 
    var.p = &(var.a);   //pointer gets address from variable 
    printf("%d\n",var.p);  // the number 2686744 is printed instead of the number '5' 

    return 0; 
} 
+4

'* var.p'와 함께 참조 부호 ... –

+0

포인터 자체는 단지 주소입니다.당신이 가리키는 값을 원한다면'*'연산자, 즉'* var.p '를 사용하여 그것을 역 참조 할 필요가 있습니다. 또한'& (var.a)'의 괄호를 제거 할 수 있고 대신에'& var. a'는 훨씬 더 표준입니다. –

+0

'.'는 단항 역 참조'*'(_not_ multiply!)보다 더 높은 우선 순위를 가지므로'* (var.p) '의 다른 제안에있는 괄호는 엄격하게 선택 사항이며 명확성이 추가 된 것으로 생각하는 독자들에게는 또는 선행 규칙을 외우는데 괴롭힘을 당할 수 없습니다 ;-). Tom의 코멘트에서 알 수 있듯이,'.' 대'&'도 마찬가지입니다. –

답변

4

printf%d 형식 지정자는 int을 기대하지만, 당신은 그것을에게 int *을 전달하고 있습니다.

printf("%d\n",*(var.p)); 
0

당신은 당신이 (포인터의 문자 주소를 인쇄하는

my_struct var; 
var.a = 5;     
var.p = &(var.a);   
printf("%d\n",*(var.p)); //this will work  
2

포인터를 역 참조하지 않는 즉, 값이 아닌 :

당신은 int를 얻기 위해 포인터를 역 참조 할 필요가 그것은 가리킨다. 그러나 그것이 가리키는 곳의 메모리에있는 주소)를 쓰면 printf("%d\n", var.p)이된다. 가리키는 값에 액세스하려면 printf("%d\n", *(var.p))으로 포인터를 역 참조해야합니다. 보조 노트로

: 인쇄에서 http://www.cplusplus.com/reference/cstdio/printf/

0

사용 *의 var.p에 : 혹시 printf 가족 기능에 어떤 이유로, 대신 %p 형식 지정자를 사용하기위한 포인터의 주소를 액세스하려는 경우 포인터 p를 역 참조하고 값을 얻는다. 지금은 십진법으로 메모리 위치를 인쇄하고 있습니다.

+1

'var'은 포인터가 아니므로'->'를 사용할 수 없습니다. (내 투표가 아님) – DaV

+0

오른쪽, 내 잘못 – meJustAndrew

0

포인터 var.p는 주소가 인 입니다. 내가 포함한다고 말할 때, 그것은 가치가 주소라는 것을 의미합니다. 귀하의 경우이 주소는 var.a의 주소입니다. 을 인쇄하려고하면 var.a의 주소가 인쇄됩니다.

당신이 무엇을 인쇄하려면

이 주소에 포함, 또는이 주소에서 VALUE 무엇인지, 당신은 그것을하기 전에 별을 넣어해야합니다.

귀하의 경우에, 당신은이 주소로, var.p의 을 인쇄하지 않습니다,하지만 당신은 * (var.p)를 사용하여 값이이 주소로를 포함 인쇄 할.

일부 언어는 "var.p"와 " (var.p)"사이에 차이가있을 수 있습니다. 수학에서 이러한 조작을 생각해보십시오 : (2x3) ² 및 2x3². 제 2 동작시에는, ²는 숫자에 영향을 미칠 때 첫 번째 작업에 는 ² 3.

사실, 어떻게 언어를 알고 스스로 그것을 시도 할 수 있습니다, 전체 곱셈에 영향을 미칠 것이다 * var.p는 다른 결과를 줄 수 있습니다 :) 그러나이 경우 괄호를 사용하는 것이 언어가 동일한 결과를 제공하더라도 우수 사례입니다.

추신 : 단지 printf를 사용하여 주소를 인쇄해야하는 경우 (현재는 그렇지 않습니다. 소수점 인쇄 만하고 싶음) % d을 % p로 바꿉니다.

+1

연산자 우선 순위에 대한 추가 정보는 여기에 적용되지 않으므로 오해의 소지가 있습니다. '* (var.p)'는'.v'보다 우선 순위가 높기 때문에 '* var.p'와 같습니다. –

관련 문제