검색결과 리스트
글
C에서 호출할 떄 매개변수는 그 값만을 전달하므로(call by value) 호출된 함수에서 호출한 함수의 변수 값을 바꾸는 것은 불가능하다. 예를 들어 두 변수의 값을 교환하는 함수를 다름과 같이 호출했다고 하자
swap(a,b)
이때 swap라는 함수가 다음과 같다면
void swap(int x, int y) /* wrong */
{
int temp;
temp = x;
x = y;
y = temp;
}
프로그램은 우리가 원하는 대로 실행되지 않는다. a와 b는 호출한 함수의 변수이므로 그 값을 swap라는 함수에서 바꿀 수 없고 단지 swap 함수 내에거 x와 y의 값이 바뀌었을 뿐이다. x,y대신 a,b처럼 함수 밖의 변수명을 같은 변수명으로 사용해도 마찬가지이다.
원하는 결과를 얻으러면 다음과 같이 포인터를 사용하면 된다.
swap(&a,&b);
연산자 &는 변수의 주소를 알아내는 연산자 이므로 &a는 a를 가리키는 포인터이다 함수 swap 내에서는 매개변수들을 포인터로 정의해 준다 swap 함수는 다음과 같다.
void swap(int *px, int *py) /* interchange *px and *py */
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
포인터를 사용하면 호출된 함수에서 호출한 함수의 변수박을 바꿀수 있다 예를 들어 입력된느 문자열을 호출할때마다 한 자씩 정수로 바꾸는 getint를 생각해보자 이 함수는 더이상 입력이 없을 경우 파일의 끝을 나타내는 기호(EOF)를 출력해 주어야 한다. EOF는 다른 문자들과 혼동되지 않게 출력해야 한다.
한자기 방법은 문자를 정수로 변환한 값은 함수의 매개변수를 통해 보내고 EOF는 함수의 출력으로 보내는 것이다 이는 제 7장에서 설명한 scanf 함수에서 사용하는 방법이다.
다음 문장은 함수 getint를 호출하여 배열의 원소에 정수를 넣어준다.
int n,array[SIZE],getint(int *);
for (n=0; n<SIZE && getint(&array[n]) !-EOF; n++)
;
입력이 있으면 getint 함수는 그 입력을 받아들이고 n은 1만큼 증가된다 getint 함수가 제대로 동작하기 위해서 array[n]의 번지를 알아야 한다는데 주의 하자. 파일의 끝에서는 EOF를 출력하며 다음 입력이 숫자가 아닐때는 0을 출려하고 숫자일 때는 양수를 출력하느 프로그램은 다음과 같다.
#include <ctype.h>
int getch(void);
void ungetch(int);
/* getint : get next integer from input into *pn */
int getint(int *pn)
{
int c,sign;
while (isspace(c-getch())) /* skip white space */
;
if(!isdigit(c) && c != EOF && c != '+' && c != '-' ) {
ungetch(c); /* int's not a number */
return 0;
}
sign = ( c == '-') ? -1 : 1;
if (c == '+'|| c == '-')
c = getch();
for (*pn = 0; isdigit(c); c= getch())
*pn = 10 * *pn + ( c - '0');
*pn *= sign;
if(c != EOF)
ungetch(c);
return c;
}
함수 getint에서 *pn은 정수형(int) 변수로 사용되었으며 한 문자를 다시 입력으로 읽어들이기 위해 getch와 ungetch(4.3)를 사용했다.
예제 5-1 위의 프로그램에서 숫자 앞이 아닌 다른 곳에 있는 + 와 - 는 0으로 취급되었다 입력으로 읽을수 있도록 해보라.
예제 5-2 부동소수점을 출력하고 getint 와 같은 동작을 하는 함수 getfloat를 작성하라 함수 값은 어떤 형의 값이 될까?
** 나도 처음에 call by value에 대해서 이해가 안갔는데 새로 예제를 만들어 보며 이해가 갔다
예를들어 단순하게 20을 더하는 함수를 만들라 했을때
보통
#include <stdio.h>
void my_func(int n) /* interchange *px and *py */
{
n = n+20;
printf("%d\n",n);
}
int main(void)
{
int n = 10;
my_func(n); //함수 내에서 더하고 출려까지 함
printf("%d",n);//하지만 메인함수에서의 n은 바꾸지 않음 예를들기 위해 씀
}
이렇게 만든다 20을 더하고 그 함수가 그냥 출력까지 하도록 함수를 만들고 다시돌아온 메인에서 출력까지 하지 않았다
하지만 메인에서 다시 n을 출력해보면? func값이 들어간건 들어간거고 메인에서는 상관 없이 n=10이라는 것을 출력한다 func에 내에서는 바뀌었으나 바뀌고 나오면 컴퓨터는 메모리를 지워버리고 n은 평범한 n으로 돌아오는 것이다
하지만 함수에서 아 이함수말고 메인에서 까지 바꾸고 싶어! 라고 할때 쓰는것이 바로 포인터이다.
'프로그래밍 > C' 카테고리의 다른 글
5.4 번지 연산(Address Arithmetic) (0) | 2014.11.03 |
---|---|
5.3 포인터와 배열(Pointers and Arrays) (0) | 2014.11.03 |
5.1 포인터와 주소(Pointers and Addresses) (0) | 2014.11.03 |
4.11 C 프리프로세서(The C Preprocessor) (0) | 2014.11.02 |
4.10 되부름(Recursion) (0) | 2014.11.02 |
RECENT COMMENT