Skip to content

Commit 9b472f4

Browse files
committed
11.1 공부 완료
1 parent 1e0b4a3 commit 9b472f4

File tree

5 files changed

+157
-0
lines changed

5 files changed

+157
-0
lines changed

Chap11-MemoryAndPointer/Chap11-MemoryAndPointer.md

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,82 @@ x의 주소(&x) : 0019FEF8
163163

164164
### 11.1.3 포인터와 배열
165165

166+
배열의 이름은 0번 요소의 주소이며, 전체 배열을 대표하는 식별자이다. 포인터 변수는 주소를 저장하기 위한 변수이므로 **"배열의 이름이 주소이므로, 포인터 변수에 저장할 수 있다."** 라는 추론이 가능하다. 즉, `int`형 포인터에 `int`형 변수의 주소만 담을 수 있는 것이 아니라, `int`형 배열의 이름도 담을 수 있다.
167+
168+
![](./images/array.png)
169+
170+
171+
172+
```c
173+
// ptrnarray01.c
174+
175+
#include <stdio.h>
176+
177+
int main(void){
178+
// int 배열 선언 및 정의. 배열의 이름은 연속된 각 요소들 중
179+
// 전체를 대표하는 0번째 요소에 대한 '주소 상수'이다.
180+
int aList[5] = { 0 };
181+
// int에 대한 포인터 변수를 배열의 이름으로 정의한다.
182+
int *pnData = aList; // => int *pnData = &aList[0];
183+
184+
// 배열의 0번 요소의 값을 출력한다.
185+
printf("aList[0] : %d\n", aList[0]);
186+
187+
// 포인터가 가리키고 있는 배열의 0번 요소의 값을 변경하고 출력한다.
188+
*pnData = 20;
189+
printf("aList[0] : %d\n", aList[0]);
190+
printf("pnData[0] : %d\n", pnData[0]);
191+
192+
return 0;
193+
}
194+
195+
/* 출력결과
196+
aList[0] : 0
197+
aList[0] : 20
198+
pnData[0] : 20
199+
*/
200+
```
201+
202+
203+
204+
위의 코드에서 `int *pnData = aList` 부분은 `int`형 배열의 이름을 "`int`에 대한 포인터의 초기값"으로 정의했다. 이 부분을 `int *pnData = &aList[0]`라고도 할 수 있다. 또한 `int *pnData = &aList[1](또는 &aList[2])` 처럼 지정하여 배열의 특정 index의 주소로 정의할 수도 있다. `*pnData=20;`에서 `*pnData`는 간접지정 연산자이며 "`pnData`포인터에 저장된 수소의 메모리를 `int`형 변수로 지정"한 것이다.
205+
206+
마지막으로, `printf("pnData[0] : %d\n", pnData[0]);` 에서의 결과값은 `aList[0]`의 값과 같다. 그 이유는 `*pnData = aList`에서 **포인터 변수 `pnData`에 저장된 주소를 기준으로 오른쪽으로 `int` 0 개 떨어진 위치(주소)의 메모리를 `int`형 변수로 지정한다**는 의미이기 때문이다. 따라서 `*pnData = 20`를 **`*(pnData + 0) = 20`** 로 쓸 수 있으며, 이 것은 또한 **`pnData[0]`** 과 같다.
207+
208+
다음 예제는 배열에 저장된 문자열의 길이를 측정하는 프로그램을 포인터 변수에 저장된 주소값을 증가시키는 방법으로 구현한 것이다.
209+
210+
```c
211+
// ptrstring01.c
212+
#include <stdio.h>
213+
// strlen() 함수를 사용하기 위한 헤더 포함
214+
#include <string.h>
215+
216+
int main(void){
217+
218+
// 문자 배열(char[16])의 선언 및 정의
219+
// 선언한 크기는 char[16]이지만 초기화는 char[6] 문자열로 한다.
220+
char szBuffer[16] = { "Hello" };
221+
// 문자 배열을 가리키는 문자 포인터 변수의 선언 및 정의
222+
char *pszData = szBuffer;
223+
int nLength = 0;
224+
225+
// pszData 포인터 변수가 가리키는 대상에 저장된 char형 데이터가
226+
// 문자열의 끝을 의미하는 NULL 문자가 될 때까지 반복문 수행
227+
while(*pszData != '\0'){
228+
pszData++;
229+
nLength++;
230+
}
231+
232+
// strlen() 함수로 문자열의 길이(바이트 단위 크기)를 출력한다.
233+
printf("Length : %d\n", nLength);
234+
printf("Length : %d\n", strlen(szBuffer));
235+
printf("Length : %d\n", strlen("World"));
236+
237+
return 0;
238+
}
239+
/* 출력결과
240+
Length : 5
241+
Length : 5
242+
Length : 5
243+
*/
244+
```
35.1 KB
Loading
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// ptrnarray01.c
2+
3+
#include <stdio.h>
4+
5+
int main(void){
6+
// int 배열 선언 및 정의. 배열의 이름은 연속된 각 요소들 중
7+
// 전체를 대표하는 0번째 요소에 대한 '주소 상수'이다.
8+
int aList[5] = { 0 };
9+
// int에 대한 포인터 변수를 배열의 이름으로 정의한다.
10+
int *pnData = aList; // => int *pnData = &aList[0];
11+
12+
// 배열의 0번 요소의 값을 출력한다.
13+
printf("aList[0] : %d\n", aList[0]);
14+
15+
// 포인터가 가리키고 있는 배열의 0번 요소의 값을 변경하고 출력한다.
16+
*pnData = 20;
17+
printf("aList[0] : %d\n", aList[0]);
18+
printf("pnData[0] : %d\n", pnData[0]);
19+
20+
return 0;
21+
}
22+
23+
/* 출력결과
24+
aList[0] : 0
25+
aList[0] : 20
26+
pnData[0] : 20
27+
*/
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// ptrstring01.c
2+
#include <stdio.h>
3+
// strlen() 함수를 사용하기 위한 헤더 포함
4+
#include <string.h>
5+
6+
int main(void){
7+
8+
// 문자 배열(char[16])의 선언 및 정의
9+
// 선언한 크기는 char[16]이지만 초기화는 char[6] 문자열로 한다.
10+
char szBuffer[16] = { "Hello" };
11+
// 문자 배열을 가리키는 문자 포인터 변수의 선언 및 정의
12+
char *pszData = szBuffer;
13+
int nLength = 0;
14+
15+
// pszData 포인터 변수가 가리키는 대상에 저장된 char형 데이터가
16+
// 문자열의 끝을 의미하는 NULL 문자가 될 때까지 반복문 수행
17+
while(*pszData != '\0'){
18+
pszData++;
19+
nLength++;
20+
}
21+
22+
// strlen() 함수로 문자열의 길이(바이트 단위 크기)를 출력한다.
23+
printf("Length : %d\n", nLength);
24+
printf("Length : %d\n", strlen(szBuffer));
25+
printf("Length : %d\n", strlen("World"));
26+
27+
return 0;
28+
}
29+
/* 출력결과
30+
Length : 5
31+
Length : 5
32+
Length : 5
33+
*/
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// ptrstring02.c
2+
3+
#include <stdio.h>
4+
5+
int main(void){
6+
char szBuffer[16] = { "Hello" };
7+
char *pszData = szBuffer;
8+
9+
// 문자열의 길이를 측정하기 위해 NULL 문자가 저장된 위치를 찾아낸다.
10+
while(*pszData != '\0')
11+
pszData++;
12+
13+
// NULL 문자가 저장된 위치(주소)에서 시작 위치(주소)를 빼면
14+
// 문자열의 길이를 알 수 있다.
15+
printf("&pszData : %p, &szBuffer : %p\n", pszData, szBuffer);
16+
printf("Length : %d\n", pszData - szBuffer);
17+
return 0;
18+
}

0 commit comments

Comments
 (0)