더블포인터 사용예제 입니다... 그런데 더블 꼭 써야하나요?
가온누리
#includestdio.h
void pswap(int *p1, int *p2);//void pswap(int **p1, int **p2);
int main(void)
{
int a=10, b=20;
int *pa=&a, *pb=&b;
//호출전
printf(pa = %d \n, *pa);
printf(pb = %d \n, *pb);
pswap(&pa,&pb);
//호출후
printf(pa = %d \n, *pa);
printf(pb = %d \n, *pb);
printf(a = %d \n, a);
printf(b = %d \n, b);
}
void pswap(int *p1, int *p2) //void pswap(int **p1, int **p2)
{
int *temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
더블 포인터를 사용하지 않았는데 포인터의 가리키는 주소를 바꿀수 있는게 이상하네요..
오류가 안나서이상함 ㅠ
위에는 제가 더블포인터 사용예를 주석처리하고 일반포인터로 call-by-reference 형태로
가리키는 주소를 변경한 것입니다.. 그런데 완포인트로도 다음과 같이 충분히 가능한데
더블포인터를 쓰는 이유가 먼가요??
-
갈기슭
void pswap(int* p1, int* p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void pswap(int** p1, int** p2)
{
int* temp = *p1;
*p1 = *p2;
*p2 = temp;
}
즉, 위에는 값을 복사하는 코드고 아래는 포인터의 위치만 바꾸어 주는 코드가 됩니다. -
든솔
이 코드는 논리적 오류를 가지고 있어 의도한 바와 다르게 동작하고 있습니다만, 그것은 C++ 의 최대 장점이자 단점입니다. 즉, 원시적인 형태로 포인터를 주무를 수 있도록 이와 같은 동작을 c/c++ 이 용납한다는 점입니다.
-
희선
crm8// \포인터는 일종의 배열입니다\ 부분이요, \배열은 일종의 포인터입니다\ 를 잘 못 쓰신것 같아여;
매니저// pswap 을 int* 로 사용하시려면 안에 temp 는 int temp; 와 같이 정의되어야 할 것 같습니다. -
하늘이
대충 감? 이 옵니다^^ 헤헤 다른경우에서는 오류가 날듯 하네요 감사합니다^^
-
뭘봐요
일단 포인터 개념부터...
포인터는 일종의 배열인거 아시죠?
더블포인터는 2차원배열인거죠...
즉, *p = p[] , **p = p[][] 인셈이죠...
대신 배열과 포인터의 차이는 선언시 길이의 지정을 하느냐 안하느냐 차이에요.
그래서 위에 소스에서는 바꿔도 별 문제가 없는거죠.
만약 변수 A나 B가 int형이 아닌 **char 였다면 안되겠죠.(안돌려봐서.... 추측임... ㅋㅋ)
대충 개념이 이러네요.. ㅎㅎ
해보시고, 제 답변에 문제 있음 댓글 -
새늘
수정했습니다^^
-
하연
말머리요? 다시한번 말씀좀 ㅠㅠ
-
하련솔
말머리가 빠졌네요.