Skip to content

Commit 3eecdfb

Browse files
committed
call-by-reference 공부중
1 parent 4b4c639 commit 3eecdfb

File tree

4 files changed

+149
-1
lines changed

4 files changed

+149
-1
lines changed

Chap12-FunctionApplication/Chap12-FunctionApplication.md

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,69 @@ int main(int argc, char* argv[]){
8484
8585
8686
87-
**포인터의 가장 큰 문제는 가리키는 대상의 실제 크기를 포인터 자체만으로는 알 수가 없다**는 것이다. 따라서, 피호출함수의 매개변수가 포인터인 경우 반드시 대상 메모리의 크기를 함께 매개변수로 받아야 한다. 위에서 `void GetName(char *pszName, int nSize)` 부분을 `void GetName(char pszName[], int nSize)`로 표현해도 의미는 둘다 포인터로 같으며, 두 번째 방법이 "매개변수로 배열의 이름이 전달"된다고 추론할 수 있으므로 가독성이 좋다고 할 수 있다.
87+
**포인터의 가장 큰 문제는 가리키는 대상의 실제 크기를 포인터 자체만으로는 알 수가 없다**는 것이다. 따라서, 피호출함수의 매개변수가 포인터인 경우 반드시 대상 메모리의 크기를 함께 매개변수로 받아야 한다. 위에서 `void GetName(char *pszName, int nSize)` 부분을 `void GetName(char pszName[], int nSize)`로 표현해도 의미는 둘다 포인터로 같으며, 두 번째 방법이 "매개변수로 배열의 이름이 전달"된다고 추론할 수 있으므로 가독성이 좋다고 할 수 있다.
88+
89+
다음 예제는 Call-by-reference가 필요한 가장 대표적인 상황을 설명하는 예제로, 두 변수간의 '교환'(swap)을 함수로 구현한 것이다. 아래의 코드에서 `Swap()` 함수는 `int` 에 대한 포인터 변수를 간접지정해서 **대상 메모리에 대해 교환을 수행**한다.
90+
91+
```c
92+
// funcswap01.c
93+
#include <stdio.h>
94+
95+
// 매개변수로 주소를 받는다.
96+
void Swap(int *pLeft, int *pRight){
97+
98+
// 주소가 가리키는 대상의 메모리의 값을 교환한다.
99+
int nTmp = *pLeft;
100+
*pLeft = *pRight;
101+
*pRight = nTmp;
102+
}
103+
104+
int main(void){
105+
106+
int x = 10, y = 20;
107+
printf("x=%d, y=%d\n", x, y);
108+
// 호출자 함수에 선언된 지역변수의 주소를 전달한다.
109+
// 따라서 함수가 반환한 후 x와 y의 값은 서로 교환된다.
110+
Swap(&x, &y);
111+
printf("x=%d, y=%d\n", x, y);
112+
return 0;
113+
}
114+
115+
/* 출력결과
116+
x=10, y=20
117+
x=20, y=10
118+
*/
119+
```
120+
121+
122+
123+
다음 예제는 **문자열의 길이를 측정하는 기능을 함수로 구현**한 예제이다.
124+
125+
```c
126+
// funcstrlen01.c
127+
#include <stdio.h>
128+
129+
// 매개변수로 전달된 문자열의 길이를 반환하는함수
130+
int GetLength(const char *pszParam){
131+
132+
int nLength = 0;
133+
while(pszParam[nLength] != '\0')
134+
nLength++;
135+
136+
return nLength;
137+
}
138+
139+
int main(int argc, char* argv[]){
140+
141+
char *pszData = "Hello";
142+
143+
printf("%d\n", GetLength("Hi"));
144+
printf("%d\n", GetLength(pszData));
145+
return 0;
146+
}
147+
/* 출력결과
148+
2
149+
5
150+
*/
151+
```
152+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// funcgetname02.c
2+
#include <stdio.h>
3+
#include <stdlib.h>
4+
5+
// 주소를 반환하는 사용자 정의 함수 선언 및 정의
6+
char* GetName(void){
7+
8+
char *pszName = NULL;
9+
10+
// 메모리를 동적 할당한다.
11+
pszName = (char*)calloc(32, sizeof(char));
12+
printf("이름을 입력하세요 : ");
13+
14+
// 동적 할당한 메모리에 사용자가 입력한 문자열을 저장한다.
15+
fgets(pszName, sizeof(char)*32, stdin);
16+
// 동적 할당한 메모리의 주소를 호출자 함수에 반환한다.
17+
return pszName;
18+
}
19+
20+
int main(int argc, char* argv[]){
21+
22+
char *pszName = NULL;
23+
24+
// 이름이 저장된 동적 할당된 메모리의 주소를 반환한다.
25+
pszName = GetName();
26+
printf("당신의 이름은 %s입니다.\n", pszName);
27+
28+
// 호출자 함수가 메모리를 해제해야 한다.
29+
free(pszName);
30+
return 0;
31+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// funcstrlen01.c
2+
#include <stdio.h>
3+
4+
// 매개변수로 전달된 문자열의 길이를 반환하는함수
5+
int GetLength(const char *pszParam){
6+
7+
int nLength = 0;
8+
while(pszParam[nLength] != '\0')
9+
nLength++;
10+
11+
return nLength;
12+
}
13+
14+
int main(int argc, char* argv[]){
15+
16+
char *pszData = "Hello";
17+
18+
printf("%d\n", GetLength("Hi"));
19+
printf("%d\n", GetLength(pszData));
20+
return 0;
21+
}
22+
/* 출력결과
23+
2
24+
5
25+
*/
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// funcswap01.c
2+
#include <stdio.h>
3+
4+
// 매개변수로 주소를 받는다.
5+
void Swap(int *pLeft, int *pRight){
6+
7+
// 주소가 가리키는 대상의 메모리의 값을 교환한다.
8+
int nTmp = *pLeft;
9+
*pLeft = *pRight;
10+
*pRight = nTmp;
11+
}
12+
13+
int main(void){
14+
15+
int x = 10, y = 20;
16+
printf("x=%d, y=%d\n", x, y);
17+
// 호출자 함수에 선언된 지역변수의 주소를 전달한다.
18+
// 따라서 함수가 반환한 후 x와 y의 값은 서로 교환된다.
19+
Swap(&x, &y);
20+
printf("x=%d, y=%d\n", x, y);
21+
return 0;
22+
}
23+
24+
/* 출력결과
25+
x=10, y=20
26+
x=20, y=10
27+
*/

0 commit comments

Comments
 (0)