2중 포인터의 call by reference
글쓴이: yul2 / 작성시간: 목, 2005/05/05 - 9:11오후
동적할당을 통해 다중스택을 구현하는 프로그램을 짜고 있는중입니다... 제가 다중 포인터의 함수 전달에 대한 개념이 제대로 안잡혀 있는지라.... 참... 힘이드네요..
이전에 동적할당 구조체 스택을 짤때에도... 애러가 뜨면.. 끼워맞추기식으로 바꿔바꿔가며 겨우 짯었거든요....
2중 이상의 포인터로 넘어가면 도저히 어떻게 돌아가는지 모르겠습니다... 똑같은 포인터변수를 매개변수로 넘겼는데도 한함수에서는 애러가 나고... 다른 함수에서는 애러가 나지 않고 할때도 있고요.... 지금 머리가 깨질것 같습니다... 고수님들 제발 갈쳐주세요!!
ㅠ.ㅠ;;;;; 참고로 밑에 올려놓은 소스(짜고있었던) 의 print()함수 까지도 매개변수에 주소가 제대로 전달되지 않은듯 하네요....
어떻게 호출부에서 어떻게 호출하고 선언부에서 어떻게 받으면 어떤 용도로 사용할수 있고 어떻게 되는지 자세~~~히좀 가르쳐주세요....
/* Multi stack program */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #define MAX 10 /* MAX를 조정함으로서 stack의 사이즈를 조정 */ typedef struct stack * STACKPTR; struct stack { int item; STACKPTR next; } ; void init( void ); void push( STACKPTR *, int ); void pop( void ); void print( STACKPTR *, int ); void main( void ) { int sel=1, num, i; STACKPTR top[MAX]; for ( i=0; i<MAX; i++ ) top[i] = NULL; while ( sel != 3 ) { init(); scanf("%d", &sel); switch( sel ) { case 1 : printf("selset the stack number: "); scanf("%d", &num); push( &top[num], num ); break; case 2 : pop(); break; case 3 : sel = 3; } } } void init( void ) { printf("select the menu\n"); printf("1.push\n2.pop\n3.end\n\n"); printf("input: "); } void push( STACKPTR *top, int num ) { STACKPTR temp; temp = ( STACKPTR )malloc( sizeof( STACKPTR ) ); printf("input the integer type data: "); scanf("%d", &temp->item); temp->next = *top; *top = temp; print( top, num ); } void pop( void ) { } void print( STACKPTR *top, int num ) { printf("The %d th's stack data\n\n", num); printf("%d\n", *top); getch(); }
Forums:
이상하네요저번에도 비슷한 플그림으로 질문하셨는데...http:
이상하네요
저번에도 비슷한 플그림으로 질문하셨는데...
http://bbs.kldp.org/viewtopic.php?t=55716
여기에 올리셨던 코드랑 push() 함수를 비교해 보세요
그럼 뭐가 문제인지 알게 되실 겁니다
근데 뭐하시는건가요?
숙제도 아니고 일도 아니신거 같은데
그냥 궁금해서 여쭈어보는거니 기분 나쁘게 생각지는 마세요 ^^
개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?
언뜻 보니, struct stack 은 리스트로 만드려고 하신것 같은데,
언뜻 보니, struct stack 은 리스트로 만드려고 하신것 같은데,
막상 함수를 부르실때는, pointer ++ 같은건 안하시는군요?
배열과 리스트가 섞여있어서 일관성이 없어서 헤깔리신것 같고요..
typedef struct stack * STACKPTR; 라고 정의한부분에서,
print() 의 경우 STACKPTR *top 으로 받게되면,
결국 그 인스턴스 top 의 타입은 (struct stack **) 이 되는데요.
*top 의 타입이 (struct stack *) 이 되니깐, 한번더 dereference 를
해야하지만, *top 이 정확한 메모리를 가리키고 있다고 보기도 힘들군요?
지금 일하는 중이라서, 간단히만 말씀드리고 갑니다.
삽질의 대마왕...
답변 감사합니다..
일단... 해결은 했습니다!! 좀더 생각해보고.. 어찌어찌 하다보니... 해결이 되었네요.. 사실.... 이번것도 끼워맞추기 식으로 해결한 듯한 감이 있지만... 조금씩 감이 잡혀가는듯도 하는군요.. ^^;;
제가 생각 할때는 제가.... 호출할때의 ( top ) 이렇게 호출하는것
과 ( &top ) 이렇게 호출할때와 ( *top ) 이렇게 호출할때의 차이점을 잘 모르는 것 같습니다...
차이점을 알고 계신다면 명쾌하게 답변좀 부탁드립니다..
분명히 call by value 는 하나도 없는듯 하고...
셋 모두 call by reference 의 일종인 것 같은데... 차이점을
모르겠네요... 답변 꼭 부탁요~~
아!! 그리고 제가 뭐하고 있는건지 궁금하다고 위에 님이 물으셨는데요.... 그냥 공부하는겁니다.. ㅡ,.ㅡ;;;
전역한지 몇개월 안되는 휴학생인데요... 학교가서 자료구조수업 도강하러 가서 듣고... 저런것도 있구나 해서... 한번 짜봤는데...
제가 생각했던대로는 짰는데... 짜놓구 보니 교수님이 이야기 하신것과는 다른 프로그램이 된거 같은... ㅎㅎㅎ
그냥... 프로그램이 재미있고.... 그래서 열심히 공부하고있는 공도리 휴학생이랍니다~~~
앞으로도 질문 마니 올릴듯한데... 마니 도와주세요~~ ^^;;;
워낙 실력이 없어서... ㅡ.ㅜ;;
[quote]제가 생각 할때는 제가.... 호출할때의 ( top ) 이렇
가장 단순화 시킨 예를 들어 보겠습니다.
int num = 999;
int * ptr = #
예를 들어 num 변수의 주소값이 0x0001 이고
ptr 변수의 주소값이 0x0002라고 하면
(여기서 주소값이란..해당 변수가 저장되는 공간의 주소이죠..)
&ptr = 0x0002
ptr = 0x0001
*ptr = 999
위와 같이 다릅니다..
C에서 call by reference는 없습니다.
오직 call by value 뿐입니다.
Re: 답변 감사합니다..
맞게 고치셨습니다.
C에서는 모든 인자 전달이 call by value입니다. 포인터를 이용해서 call by reference의
효과를 내는 거죠.
포인터도 변수라는 점에서는 다른 변수와 같습니다. 똑같이 메모리를 차지하고
포인터를 인자로 넘길 때도 포인터 변수가 갖고 있는 값(주소)가 복사되지요.
제가 보기엔 STACKPTR이라는 것을 typedef해서 더 혼란스러워 하시는 것 같습니다.
그냥 struct stack*로 고쳐 쓰고 잘 따져 보세요.
댓글 달기