본문 바로가기
프로그래밍 언어/C

매개변수 전달

by 진진리 2023. 9. 22.
728x90
  • 값에 의한 전달(Call By Value)

호출 함수와 피호출 함수의 인자 값은 같지만 메모리는 독립적

int Add(int x, int y){
    int x = x + y;
    return z;
}

int main(void){
    int x = 3;
    int y = 5;
    int sum = Add(x, y);
    
    printf("%d", sum); //8
    
    return 0;
}

 

  • 참조에 의한 전달(Call By Reference)

호출 함수와 피호출 함수의 인자는 같은 개체

호출 함수에서 메모리 주소를 전달 (포인터 매개 변수 사용)

 

void swap(int *x, int *y){
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main(void){
    int x = 3;
    int y = 5;
    swap(&x, &y);
    
    printf("%d %d", x, y); //5 3
    
    return 0;
}

  • 문자열 매개변수
void PrintStr(char *s){
    printf("%s", s); //Hello
}

int main(void){
    char str[10] = "Hello";
    PrintStr(str);
    
    return 0;
}

 

 

  • 문자열 포인터 매개변수
void swap_ptr(char** x, char** y){ //포인터의 주소를 받아야 하므로
    char *tmp = *x;
    *x = *y;
    *y = *tmp;
}

int main(void){
    char *s1 = "ABCD";
    char *s2 = "EFGH";
    
    swap_ptr(&s1, &s2);
    
    return 0;
}

 

 

  • 배열 매개변수
void PrintArray(int arr[], int count){
    for(int i=0; i<count; i++)
    	printf("%d ",arr[i]);
}

int main(void){
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    PrintArray(arr, sizeof(arr)/sizeof(int));
    
    return 0;
}

 

 

  • 2차원 배열 매개변수
void Print2Darray(int arr[][5], int row, int col){  //2차원 배열의 가로 길이 입력
    for(int i=0; i<row; i++)
    	for(int j=0; j<col; j++)
    		printf("%d ",arr[i][j]);
}

int main(void){
    int arr[10] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
    int row = sizeof(arr)/sizeof(arr[0]);
    int col = sizeof(arr[0])/sizeof(int);
    
    Print2Darray(arr, row, col);
    
    return 0;
}

int arr[][5];는 int (*arr)[5];와 동일

(*arr)[5]: 배열 포인터 형식

-> 가로 길이를 쓰지 않으면 포인터가 가리키는 대상의 크기를 알 수 없으므로 오류 발생!

1. 포인터 배열: 배열의 요소가 포인터  -> 선언방법: char* arr[3];
2. 배열 포인터: 배열을 가리키는 하나의 포인터  -> 선언 방법: char (*arr)[3];
// char (*arr)[3] : 'char 타입의 인덱스를 3개 가지는 배열'을 가리키는 포인터 arr

 

 

  • 구조체 매개변수 (값에 의한 전달)
struct Person {
    char name[20];
    int age;
    char address[100];
}

void printPerson(struct Person p){
    printf("이름: %s\n", p.name);
    printf("나이: %d\n", p.age);
    printf("주소: %s\n", p.address);
}

int main(void){
    struct Person p1;
    
    strcpy(p1.name, "홍길동");
    p1.age = 30;
    strcpy(p1.address, "서울시");
    
    printPerson(p1);
    
    return 0;
}

 

 

  • 구조체 포인터 매개변수 (참조에 의한 전달)
struct Person {
    char name[20];
    int age;
    char address[100];
}

void setPerson(struct Person *p){
    strcpy(p1->name, "고길동");
    p1->age = 40;
    strcpy(p1->address, "서울시 서초구");
}

int main(void){
    struct Person p1;
    
    strcpy(p1.name, "홍길동");
    p1.age = 30;
    strcpy(p1.address, "서울시");
    
    printPerson(&p1);
    
    return 0;
}

 

 

  • 함수 매개변수
int cal(int x, int y, int(*func)(int a, int b){
    return func(x, y);
}

int add(int x, int y){
    return x+y;
}

int sub(int x, int y){
    return x-y;
}

int main(void){
    int a=200;
    int b=100;
    int sum = cal(a, b, add);
    int diff = cal(a, b, sub);
    
    printf("%d %d\n", sum, diff); //300 100
    
    return 0;
}

'프로그래밍 언어 > C' 카테고리의 다른 글

지역 변수, 전역 변수, 정적 변수  (0) 2023.09.23
문자열, 공백 포함 문자열 입력  (0) 2023.09.23
goto문  (0) 2023.09.22
2차원 배열 동적 할당  (0) 2023.09.21