call by reference

2024. 6. 16. 11:31정보처리,전산/Clang

반응형

참조에 의한 호출은 실 주소를 함수 호출문의 피호출 함수로 전달하고 피호출 함수는 전달받은 주소를 포인터에 저장하여 사용한다.

 

--함수 호출
func(&a,&b);

--피호출
func(int *x, int *y)

 

 

 

실인수와 가인수는 나열 순서대로 대응되어 &a가 포인터 x에 전달되며 포인터 x, y에 저장된 주소를 이용해서 변수 a, b의 값을 알 수 있다.

 

*x는 x가 가리키는 주소에 들어있는 데이터 a와 같다.

*y는 y가 가리키는 주소에 들어있는 데이터 b와 같다.

#include <stdio.h>

void func(int *a, int *b);
int main()
{
    int a = 10, b = 50;
    printf("Before func: a = %d, b = %d\n", a, b);
    func(&a, &b);
    printf("After func: a = %d, b = %d\n", a, b);
    return 0;
}

void func(int *x, int *y)
{
    *x = *x + 100;
    *y = *y + 100;
}



Before func: a = 10, b = 50
After func: a = 110, b = 150

 

 

*x *y를 다른 값으로 바꾸는 것은 변수 a와 b의 값을 다른 값으로 바꾸는 것과 같다. 인수로 배열명을 쓰면 피호출 함수는 전달받은 배열명을 이용하여 배열 원소 값을 알수 있으며 피호출 함수에서 배열 원소의 값을 읽어서 연산하고 결과를 다시 배열 원소에 대입할 수 있어 return으로 반환하지 않아도 된다. 즉, 배열명을 이용하면 호출 함수와 피호출 함수 간에 데이터 전달이 간단해진다.

 

 

 

 

 

 

 

 

#include <stdio.h>
void test(int *i, int *j);
int main() {
  int a = 2, b = 7;
  printf("a=%d,b=%d\n", a, b);

  test(&a, &b); //실제 인수=변수의 주소
  printf("%d,%d",a, b);  //교환된 값
}

void test(int *i, int *j) //가짜 인수 =포인터

{
  int temp;
  temp = *i;
  *i = *j;
  *j = temp;
}

 

 

 

 

 

● 배열 주소 참조

 

#include <stdio.h>
void sum_avg(int *pA, int *psum,double *pavg);
int main()
{
  int  A[10]={0,1,2,3,4,5,6,7,8,9};
  int sum=0;
  double avg;
  sum_avg(A,&sum,&avg); //배열 A시작 주소를 가인수로 전달
  printf("sum=%d, avg=%f\n",sum,avg);
  return 0;
}

void sum_avg(int *pA, int *psum,double *pavg)
{
  int i;
  for(i=0;i<10;i++)
    *psum+=*(pA+i);
  *pavg=*psum/10.0;
}

 

- 함수 호출문에서 실제 인수 주소는 피호출 함수의 포인터에 순서대로 전달된다.

반응형

'정보처리,전산 > Clang' 카테고리의 다른 글

전역변수 값 전달  (0) 2024.06.22
비트연산  (0) 2024.06.22
랜덤 숫자 발생 후 입력 값 존재 유무 찾기  (0) 2024.05.29
최빈값 구하기  (0) 2024.05.16
배열 포인터  (0) 2024.04.08