안녕하세요 오늘은 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 |