우리의 IT
C언어 - 포인터 본문
✅ C 언어 - 포인터 (Pointer)
✔ 포인터란?
C 언어에서 포인터(Pointer) 는 메모리 주소를 저장하는 변수
✔ 주소를 이용해 변수를 직접 조작 가능
✔ 동적 메모리 할당, 배열, 함수, 구조체와 함께 많이 사용됨
🔹 1. 포인터 기본 개념
📌 포인터 선언 및 사용법
#include <stdio.h>
int main() {
int a = 10; // 일반 변수
int *p = &a; // 포인터 변수 (a의 주소 저장)
printf("a의 값: %d\n", a);
printf("a의 주소: %p\n", &a);
printf("포인터 p가 가리키는 값: %d\n", *p); // 역참조 (dereferencing)
return 0;
}
✅ 출력 예시
a의 값: 10
a의 주소: 0x7ffeefbff5a4
포인터 p가 가리키는 값: 10
✅ 핵심 개념
연산자 설명
| & | 변수의 주소를 구함 |
| * | 포인터가 가리키는 값(역참조) |
🔹 2. 포인터의 주소값 변경
📌 포인터가 다른 변수를 가리키도록 변경 가능
#include <stdio.h>
int main() {
int x = 5, y = 20;
int *ptr = &x; // ptr이 x의 주소를 가리킴
printf("ptr이 가리키는 값: %d\n", *ptr); // 5
ptr = &y; // ptr을 y로 변경
printf("ptr이 가리키는 값: %d\n", *ptr); // 20
return 0;
}
✅ 출력 예시
ptr이 가리키는 값: 5
ptr이 가리키는 값: 20
🔹 3. 배열과 포인터
📌 배열의 이름은 배열의 첫 번째 요소의 주소를 의미함
#include <stdio.h>
int main() {
int arr[3] = {10, 20, 30};
int *p = arr; // arr은 arr[0]의 주소
printf("배열 첫 번째 값: %d\n", *p); // 10
printf("배열 두 번째 값: %d\n", *(p + 1)); // 20
printf("배열 세 번째 값: %d\n", *(p + 2)); // 30
return 0;
}
✅ 출력 예시
배열 첫 번째 값: 10
배열 두 번째 값: 20
배열 세 번째 값: 30
🔹 4. 포인터 연산
📌 포인터는 +, - 연산 가능 (주소 이동)
#include <stdio.h>
int main() {
int arr[3] = {1, 2, 3};
int *p = arr;
printf("%d ", *p); // 1
p++;
printf("%d ", *p); // 2
p++;
printf("%d\n", *p); // 3
return 0;
}
✅ 출력
1 2 3
🔹 5. 문자열과 포인터
📌 문자열은 char * 포인터로 표현 가능
#include <stdio.h>
int main() {
char str[] = "Hello";
char *p = str;
while (*p != '\0') {
printf("%c", *p);
p++;
}
return 0;
}
✅ 출력
Hello
🔹 6. 포인터와 동적 메모리 할당
📌 실행 중에 메모리를 동적으로 할당 가능 (malloc(), free())
#include <stdio.h>
#include <stdlib.h>
int main() {
int *p = (int *)malloc(3 * sizeof(int));
if (p == NULL) {
printf("메모리 할당 실패\n");
return 1;
}
for (int i = 0; i < 3; i++) {
p[i] = (i + 1) * 10;
}
printf("동적 배열 값: %d %d %d\n", p[0], p[1], p[2]);
free(p); // 할당한 메모리 해제
return 0;
}
✅ 출력
동적 배열 값: 10 20 30
✅ 핵심 개념
함수 설명
| malloc(size) | 메모리 할당 (초기화 안됨) |
| calloc(n, size) | 초기화된 메모리 할당 |
| realloc(ptr, newSize) | 메모리 크기 변경 |
| free(ptr) | 메모리 해제 |
🔹 7. 포인터 배열과 이중 포인터
📌 포인터 배열 (char *arr[])
#include <stdio.h>
int main() {
char *words[] = {"Apple", "Banana", "Cherry"};
for (int i = 0; i < 3; i++) {
printf("%s\n", words[i]);
}
return 0;
}
✅ 출력
Apple
Banana
Cherry
📌 이중 포인터 (int **pp)
#include <stdio.h>
int main() {
int a = 10;
int *p = &a;
int **pp = &p;
printf("a의 값: %d\n", **pp); // 10
return 0;
}
✅ 출력
a의 값: 10
✅ 핵심 개념
개념 설명
| int *p | 포인터 (변수의 주소 저장) |
| int **pp | 이중 포인터 (포인터의 주소 저장) |
🚀 정리
개념 설명
| * | 포인터가 가리키는 값(역참조) |
| & | 변수의 주소 |
| 포인터 연산 | p++, p-- (주소 이동) |
| 배열 & 포인터 | arr[i] == *(arr + i) |
| 문자열 & 포인터 | char *str = "Hello"; |
| 동적 메모리 | malloc(), free() |
| 이중 포인터 | int **pp |
✅ 포인터를 잘 활용하면 효율적인 C 프로그래밍이 가능! 🚀
'정보처리기사' 카테고리의 다른 글
| JAVA - 클래스 (0) | 2025.03.27 |
|---|---|
| JAVA - 배열 (0) | 2025.03.27 |
| C언어 - 유틸리티 함수 (0) | 2025.03.27 |
| C언어 - 표준함수 (0) | 2025.03.27 |
| C언어 - 함수 (0) | 2025.03.27 |