Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
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
31
Tags
more
Archives
Today
Total
관리 메뉴

우리의 IT

C언어 - 포인터 본문

정보처리기사

C언어 - 포인터

우리의 IT 2025. 3. 27. 13:08

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