프로그래밍 언어/C언어

함수 선언할 때 매개변수에 *넣는거와 안넣는거 차이점.

원원 2020. 1. 6. 08:03

안녕하세요 오늘은 C언어에서 사용자함수를 정의 할 때 매개변수에 *를 넣을때와 안넣을 때 차이점을 알아보겠습니다



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
 
int noChange(int i)
{
    i=100*i;
    return i;
}
 
int change(int *i)
{
    *i=200*(*i);
    return *i;
}
int main()
{
    int a= 1;
    int b= 1;
    
    printf("noChange 함수 호출 리턴 값 : %d \n", noChange(a));
    printf("change 함수 호출 리턴 값 : %d \n", change(&b));
    
    printf("int형 변수 a 값 : %d \n", a);
    printf("int형 변수 a 값 : %d \n", b);
}


위의 코드에서 noChange함수의 매개변수는 int i고 change함수의 매개변수는 int *i입니다

5번째 줄 : 전달받은 매개변수에 *100을 하고있습니다

6번째 줄 : *100을 한 값을 리턴합니다 

11번째 줄 : 전달받은 매개변수에 *200을 하고 있습니다. 

    *i=200*(*i);
여기서 *i로 쓴 이유는 i는 주소값을 의미하고, *i는 주소값에 있는 값을 의미해서 *로 쓰고 연산을 한 것 입니다.

12번째 줄 :  *200을 한 값을 리턴합니다
마찬가지로 *i로 쓴 이유는 i의 주소값에 있는 값을 리턴하기 위함입니다

19번째 줄 :  noChange함수의 리턴한 값을 호출합니다

20번째 줄 : change함수의 리턴한 값을 호출합니다. 전달인자에 &b로 쓴 이유는 change함수의 매개변수가 포인터형 이여서입니다

22번째 줄 : 변수 a값을 출력하빈다

23번째 줄  : 변수 b값을 출력하빈다 


코드 실행결과

noChange 함수 호출 리턴 값 : 100

change 함수 호출 리턴 값 : 200

int형 변수 a 값 : 1

int형 변수 b 값 : 200



변수 a의 값은 안변하고 변수 b의 값을 변한 것을 볼 수 있습니다

그 이유는 noChange의 함수의 매개변수는 단순히 변수의 값만 복사해서 사용했는데, change함수의 매개변수는 주소값을 이용해서 사용했습니다

change함수의 매개변수는 주소값에 있는 값을 바꿨으므로 실제 b의 값이 변한 것 입니다


결론 : 매개변수에 *로 선언되어있으면, 함수를 호출할 때 그 값이 변한다






- 매개변수가 배열인경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
 
 
typedef struct item
{
    char one;
    char two;
}item;
 
typedef struct user
{
    item it;
}user;
 
 
void seeItem(user *us)
{
    printf("one : %c \n",us->it.one);
    printf("two : %c \n",us->it.one);
}
 
 
int main()
{
    user oneone;
    oneone.it.one = 'A';
    oneone.it.two = 'A';
    
    seeItem(&oneone);
}



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

C언어 배열의 변수명에 &를 붙이면?  (0) 2020.05.14
C언어 특정비트 1로 만들기  (0) 2020.02.25
#define와 #와 ##의 관계  (0) 2019.07.06
재귀함수란 무엇인가  (0) 2019.06.09
C언어의 메모리 구조  (0) 2019.06.02