Skip to content

Commit a798430

Browse files
committed
docs: C프로그래밍 활용 07
- 포인터의 개념을 이해하고, 다양한 예제를 통해 포인터의 활용법을 습득
1 parent 7030db9 commit a798430

File tree

1 file changed

+165
-0
lines changed
  • docs/C프로그래밍-활용

1 file changed

+165
-0
lines changed

docs/C프로그래밍-활용/06.md

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
---
2+
sidebar_position: 8
3+
title: 포인터와 예제
4+
description: 포인터의 개념을 이해하고, 다양한 예제를 통해 포인터의 활용법을 습득
5+
---
6+
7+
## 1. 포인터의 개요
8+
9+
### 1.1. 포인터 변수의 개념
10+
11+
- **정의:**
12+
포인터 변수는 *변수의 주소를 값으로 저장하는 변수*입니다
13+
14+
- **주소:**
15+
모든 변수는 메모리 상에 고유한 주소를 가지며, 포인터 변수는 이러한 주소를 저장하여 다른 변수에 간접적으로 접근할 수 있게 합니다.
16+
17+
---
18+
19+
### 1.2. 포인터 변수의 선언 및 초기화
20+
21+
- **선언:**
22+
`데이터타입 *포인터변수이름;` 형식으로 선언합니다.
23+
예시:
24+
25+
```c
26+
int *b; // 정수형 변수의 주소를 저장할 포인터 변수 b 선언
27+
```
28+
29+
- **초기화:**
30+
`포인터변수이름 = &변수이름;` 형식으로 변수의 주소를 포인터 변수에 할당합니다.
31+
여기서 `&`는 주소 연산자입니다.
32+
33+
예시:
34+
35+
```c
36+
int a = 10;
37+
int *b;
38+
b = &a; // b에 a의 주소 저장
39+
```
40+
41+
---
42+
43+
### 1.3. 포인터 변수의 데이터 타입 일치
44+
45+
- 포인터 변수도 데이터 타입을 가집니다.
46+
- **포인터변수가 가리키는 변수의 데이터타입과 포인터변수의 데이터타입이 일치해야 함**
47+
48+
**올바른 예:**
49+
50+
```c
51+
int i = 10;
52+
int *ip;
53+
ip = &i;
54+
```
55+
56+
**오류 예:**
57+
58+
```c
59+
float i = 10;
60+
int *ip;
61+
ip = &i; // 타입 불일치로 인한 오류
62+
```
63+
64+
---
65+
66+
### 1.4. 포인터 연산자
67+
68+
- **주소 연산자 (`&`):**
69+
변수의 주소는 `&` 연산자로 접근 가능함
70+
예: 변수 a의 주소는 `&a`로 얻을 수 있습니다.
71+
72+
- **간접 참조 연산자 (`*`):**
73+
포인터변수에 들어있는 주소의 값을 가져오는 연산자
74+
예: 포인터 변수 b가 저장하고 있는 주소에 있는 값은 `*b`로 접근할 수 있습니다.
75+
76+
- **주소 출력:**
77+
주소를 출력하기 위해서는 `printf` 함수에서 `%p` 또는 `%u` 변환 문자를 사용합니다6, p.24).
78+
79+
---
80+
81+
## 2. 포인터 활용 예제
82+
83+
### 2.1. 포인터 변수와 배열
84+
85+
- **배열의 이름:**
86+
배열의 이름은 배열의 시작 주소를 저장하는 포인터처럼 동작합니다.
87+
88+
> "배열의 이름은 배열을 시작하는 주소를 저장함"
89+
90+
- **포인터를 이용한 배열 접근:**
91+
92+
```c
93+
int arr[5] = {1, 2, 3, 4, 5};
94+
int *arptr;
95+
arptr = arr; // 배열의 시작 주소를 포인터에 할당
96+
```
97+
98+
- `arptr[i]`를 사용하여 배열처럼 접근하거나, `*(arptr + i)`를 사용하여 간접 참조 연산과 포인터 연산을 통해 배열 요소를 접근할 수 있습니다
99+
- 마찬가지로 `*(arr + i)`와 같이 배열의 이름에 직접 간접 참조 연산과 포인터 연산을 적용하여 요소를 접근할 수도 있습니다
100+
101+
---
102+
103+
### 2.2. 포인터 변수의 연산
104+
105+
포인터 변수는 값의 증가/감소 뿐만 아니라 **주소의 증가/감소 연산**도 가능합니다
106+
107+
- **`ptr++` (주소 증가):**
108+
포인터 변수 자체가 다음 메모리 위치로 이동합니다.
109+
110+
> "포인터변수는 4byte 단위로 이동합니다."
111+
> 이는 포인터가 가리키는 자료형의 크기만큼 주소가 증가함을 의미합니다.
112+
> (예: int는 4바이트, double은 8바이트, char는 1바이트)
113+
114+
```c
115+
printf("ptr=%p *ptr=%d\n", ptr, *ptr); // ptr의 값이 증가, *ptr은 새로운 주소의 값
116+
```
117+
118+
- **`(*ptr)++` (가리키는 값 증가):**
119+
포인터가 가리키는 메모리 위치에 저장된 값을 1 증가시킵니다.
120+
포인터 변수 자체의 주소는 변하지 않습니다.
121+
122+
```c
123+
printf("ptr=%p *ptr=%d\n", ptr, *ptr); // ptr은 변함없고, *ptr의 값이 1 증가
124+
```
125+
126+
- **`*(++ptr)` (주소 증가 후 참조):**
127+
포인터 변수를 먼저 증가시킨 후, 증가된 주소에 있는 값을 참조합니다.
128+
129+
```c
130+
printf("ptr=%p *ptr=%d\n", ptr, *ptr); // ptr의 값이 증가, *ptr은 새로운 주소의 값
131+
```
132+
133+
- **`*(--ptr)` (주소 감소 후 참조):**
134+
포인터 변수를 먼저 감소시킨 후, 감소된 주소에 있는 값을 참조합니다.
135+
```c
136+
printf("ptr=%p *ptr=%d\n", ptr, *ptr); // ptr의 값이 감소, *ptr은 새로운 주소의 값
137+
```
138+
139+
---
140+
141+
## 3. 학습 정리 (핵심 요약)
142+
143+
- **포인터 변수 개념:**
144+
변수의 주소를 값으로 저장하는 변수
145+
146+
- **선언 및 초기화:**
147+
148+
```c
149+
int *b;
150+
b = &a;
151+
```
152+
153+
- **데이터 타입 일치:**
154+
포인터가 가리키는 변수와 포인터 변수의 데이터 타입은 일치해야 합니다
155+
156+
- **핵심 연산자:**
157+
158+
- `&` (주소 연산자): 변수의 주소 접근 (예: `&a`는 a의 주소)
159+
- `*` (간접 참조 연산자): 포인터가 저장한 주소의 값 접근 (예: `*b`는 b가 가리키는 값)
160+
161+
- **배열과 포인터:**
162+
배열의 이름은 시작 주소를 저장하며, 포인터 변수처럼 배열에 접근하고 조작할 수 있습니다
163+
164+
- **포인터 연산:**
165+
주소 증가/감소 (`++`, `--`) 연산이 가능하며, 이는 자료형의 크기에 따라 주소값이 변경됩니다

0 commit comments

Comments
 (0)