2010-04-08 7 views
2

나는 포인터를 공부하고이 프로그램 발생이 주요 기능은 반전 값을 반환하는 이유포인터와 C 프로그램

#include <stdio.h> 

void swap(int *,int *); 

int main() 
{ 
    int a=10; 
    int b=20; 
    swap(&a,&b); 
    printf("the value is %d and %d",a,b); 
    return 0; 
} 

void swap(int *a,int*b) 
{ 
    int t; 
    t=*a; 
    *a=*b; 
    *b=t; 
    printf("%d and%d\n",*a,*b); 
} 

이 하나가 말해 줄 수 있습니까? 지금까지 이해 한 사실은 C의 함수 호출이 주요 함수와 값에 영향을 미치지 않는다는 것입니다.

나는 또한 정수처럼 점유 포인터 변수가 2 바이트 포인터의 다양한 응용 프로그램 사용과 장점을 점령 얼마나 많은 공간 알고 싶어 ...

+1

"나는 또한 어떻게 알고 싶다 ..."한 번에 한 가지 질문을하십시오. –

+1

질문 중 하나 : 포인터는 일반적으로 4 또는 8 바이트 (각각 32 및 64 비트 시스템에서) – cobbal

+0

이것은 숙제라고 생각하지 않습니다. 그는 공부하고 배우려고하는 것처럼 들립니다. –

답변

5

당신이 올바른지 : C의 기능을 할 수 없습니다 은 직접이 호출자의 값에 영향을줍니다. 그러나 swap()에 주어진 값은 ab이 아닙니다. 그보다는 그 값에 대한 포인터입니다. 기본적으로 메모리에있는 주소는 a이고 b입니다. swap에는 이러한 주소가 있으므로 해당 메모리 위치에 쓸 수 있고 ab을 효과적으로 변경할 수 있습니다.

포인터로 행운을 빈다. C가없는 컨텍스트에서 오는 경우 C를 얻는 것이 가장 어려운 일입니다. 나는 펄 (Perl)을 통해 C에 왔고, 나는 몇 번이나 포인터를 사용하여 머리를 부러 뜨렸다. 그러나 당신이 그들을 이해하면 완전히 새로운 세상을 열어 줄 것입니다.

+0

흥미 롭다. Perl은 상당히 유사한 참조를 가지고 있기 때문에 흥미 롭다. Win32 API에 액세스하고 VB6에서 저수준 COM 항목을 수행하는 방법을 파악한 * 포인터가 있습니다. –

+0

사실, Perl의 참조를 이해하는 것이 C 포인터를 얻는 열쇠였습니다. 참조는 매우 비슷하지만 좀 더 사용자에게 친숙합니다. –

2

이제 a와 b의 주소를 전달하는 두 개의 포인터가있는 스왑 함수에 a와 b의 주소를 전달합니다. a의 값은 int에 저장됩니다. b의 값은 a에 저장되고 a에 저장된 값은 b로 설정됩니다.

일단 함수가 완료되면 값이 바뀌므로 주 변수가 변경됩니다.

a와 b의 실제 값을 전달하면 주소로 변환하지 않고 주로 돌아갈 때 변경 사항을 알 수 있습니다. 이것은 포인터의 힘이며 변수의 주소를 포인터로 설정하는 것입니다.

변수의 주소를 가지고 있기 때문에 포인터가 이제 변수의 값을 변경할 수 있습니다. 네 집 열쇠를 네 이웃에게주는 것 같아. 당신의 이웃이 당신의 집에 들어가서 당신 집에있는 어떤 물건의 배열을 바꿀 수 있습니다, 그/그녀는 열쇠 (변수의 주소)를 가지고 있습니다. 이웃이 당신의 집에 들어갈 수없는 열쇠가 없다면 (가치에 의한 통과의 예) 열쇠없이 집안에 어떤 준비도 할 수 없습니다.

일반적으로 도움이되는 그림을 그립니다. 여기에 유래에 주어진 멋진 설명입니다 :

What are the barriers to understanding pointers and what can be done to overcome them?

링크에 주어진 예제는 C/C 직접하지 ++하지만 포인터/주소를 통해 값의 변경을 지원 수있는 모든 언어에 적용 할 수 있습니다.

+0

그 놀라운 답변에 대한 링크는 +1 – Earlz

+0

끝내 _ __에 대한 링크는 http://stackoverflow.com/questions/5727/what-are-the-barriers-to-understanding-pointers-and-what-can-입니다. 끝나기 전에/5754 # 5754. –

+0

@Daniel Daranas - 그건 내가 할 수있는 방법을 알아낼 수 없습니다. 답안지에서 한 가지 대답으로 어떻게 직접 가야합니까? – JonH

1

함수는 전달 된 항목 ("값으로 전달"이라고도 함)의 복사본을 수신하므로 전달 된 원본에 영향을 줄 수 없습니다. 이 경우 전달되는 것은 포인터입니다. 함수는 main에서 전달 된 포인터를 변경하지 않지만 참조 된 포인터를 변경합니다.

관련 문제