2017-11-09 7 views
-2

안녕하세요, 포인터의 인수를 구조체에 대한 포인터로 사용하는 함수가 있습니다. 내 구조체의 멤버에 액세스하는 데 문제가 있습니다. 구조체 포인터가 다른 유형의 포인터와 다르게 동작합니까? 아니면 필수적으로 중요하지 않습니까? 가능한구조체에 대한 포인터에 대한 포인터

struct mystr { 
int num; 
}; 

void fun(mystr **out) { 
    printf("%d",**out.num); <-- where the problem arises 
} 
+2

"문제가 있습니다."좋은 설명이 아닙니다. 어떤 문제가 있습니까? 오류 메시지가 나타 납니까? – klutt

+4

'(* out) -> num' 시도해 보셨습니까? – xander

+0

컴파일러 메시지에주의를 기울이십시오 – qrdl

답변

5

printf("%d",(*out)->num); 

을 다른 유형.

당신은 operators precedence을 기억해야합니다

  1. . 구조 멤버 액세스
    -> 구조 멤버 액세스 포인터를 통해
    (...)

  2. * 간접 (역 참조)
    (...)

그래서 표현 **out.num*(*(out.num))로 해석하고 (out.num)는 오류가에 따라서 별표 (*)를 적용, 포인터 하지입니다.

당신은 바인딩이 아닌 기본 연산자를 강제로 표현의 적절한 부분을 parenthesise해야합니다 (**out).num - 두 번 첫째 out 역 참조는 struct mystr 변수에 도착 후, 그 변수의 num 멤버에 액세스 할 수 있습니다.

-> 연산자 뾰족한 stucture의 부재에 액세스하기위한 바로 가기 역할 :
(ptr_expr)->member_name 그렇게하면 (*out)->num으로 (**out).num 바꿀 수 (*(ptr_expr)).member_name
동일하다.

1

솔루션에이를 사용하는 대신 아니, '구조체 포인터'(이 말은 무엇이든)에 대한 포인터로 정확하게 같은 방식으로 작동

printf("%d",**out.num); 
+0

코드 응답 만주는 것을 피하고 이것이 왜 작동하는지 설명하십시오. – user694733

1

여기 구현해야하는 방법입니다. printf("%d",(*(*out)).num);1을 인쇄합니다. 여기 m

#include<stdio.h> 
#include<stdlib.h> 

struct mystr{ 
int num; 
}; 

void fun(struct mystr **out) { 
printf("%d",(*(*out)).num); 
} 

int main() 
{ 
struct mystr m; 
struct mystr *p; 
struct mystr **pp; 
p=&m; 
pp=&p; 
m.num=1; 
fun(pp); 
return 0; 
} 

우리의 구조는, p 구조 포인터이며 pp 포인터 p 포인터이다.

관련 문제