C언어 포인터 정리

C언어의 포인터는 프로그래밍 세계에서 매우 중요한 역할을 합니다. 포인터를 제대로 이해하는 것이 고급 프로그래밍에 필수적입니다. 이 문서에서는 포인터의 기본 개념부터 다양한 활용법까지 정리하겠습니다.

포인터란 무엇인가

포인터의 정의

포인터는 메모리 주소를 저장하는 변수입니다. 변수의 메모리 주소를 가리킬 수 있으며, 간접적으로 변수 값을 조작할 수 있습니다.

int a = 10;
int *p = &a;
printf("a의 값: %d", *p); // 출력: a의 값: 10

포인터의 유형

포인터는 저장하는 데이터 타입에 따라 여러 유형이 있습니다. 예를 들어, int 포인터, float 포인터, char 포인터 등이 있습니다.

포인터의 선언 및 초기화

포인터 변수 선언

포인터 변수를 선언하려면 데이터 타입 뒤에 '*'을 사용합니다. 예를 들어, int 유형의 포인터는 int *p; 형식으로 선언합니다.

포인터의 초기화

포인터를 초기화하려면 변수의 주소를 할당합니다. 주소를 얻기 위해서는 '&' 연산자를 사용합니다.

int a = 5;
int *p = &a;

포인터와 배열

배열과 포인터의 관계

배열의 이름은 배열의 첫 번째 요소의 주소를 가리키는 포인터입니다. 따라서 배열 이름을 포인터로 사용할 수 있습니다.

int arr[3] = {1, 2, 3};
int *p = arr;
printf("첫 번째 값: %d", *p); // 출력: 첫 번째 값: 1

포인터와 배열의 접근

포인터를 사용하여 배열 요소에 접근할 수 있습니다.

int arr[3] = {4, 5, 6};
int *p = arr;
for (int i = 0; i < 3; i++) {
    printf("값: %d", *(p + i));
}

포인터와 함수

함수의 인수로서 포인터

포인터를 함수의 인수로 사용할 수 있습니다. 포인터를 사용하면 변수 값을 직접 수정할 수 있습니다.

void updateValue(int *p) {
    *p = 20;
}

int main() {
    int a = 10;
    updateValue(&a);
    printf("업데이트된 값: %d", a); // 출력: 업데이트된 값: 20
    return 0;
}

함수 포인터

함수 포인터는 함수의 주소를 가리킵니다. 이를 통해 함수도 변수처럼 전달할 수 있습니다.

#include <stdio.h>

void hello() {
    printf("Hello, World!\n");
}

int main() {
    void (*funcPtr)() = hello;
    funcPtr(); // 출력: Hello, World!
    return 0;
}

포인터 연산

포인터와 산술 연산

포인터는 덧셈과 뺄셈 같은 산술 연산을 수행할 수 있습니다. 포인터에 숫자를 더하거나 빼면, 해당 타입의 크기만큼 이동합니다.

int arr[3] = {7, 8, 9};
int *p = arr;

p += 2;
printf("세 번째 값: %d", *p); // 출력: 세 번째 값: 9

포인터 비교

포인터는 비교 연산을 사용할 수 있습니다. 같은 타입의 포인터 간에 크기를 비교할 수 있습니다.

int a = 10;
int b = 20;
int *p1 = &a;
int *p2 = &b;

if (p1 < p2) {
    printf("p1이 p2보다 작은 주소를 가리킵니다.\n");
} else {
    printf("p2가 p1보다 같거나 작은 주소를 가리킵니다.\n");
}

다중 포인터

이중 포인터

이중 포인터는 다른 포인터를 가리키는 포인터입니다. 보통 다차원 배열이나 동적 메모리 할당에 사용합니다.

int a = 10;
int *p1 = &a;
int **p2 = &p1;

printf("a의 값: %d", **p2); // 출력: a의 값: 10

다중 포인터의 활용

다중 포인터는 복잡한 데이터 구조를 처리할 때 유용합니다. 동적 메모리 할당이나 다차원 배열을 관리할 때 자주 사용됩니다.

int **arr;
arr = (int**)malloc(3 * sizeof(int*));
for (int i = 0; i < 3; i++) {
    arr[i] = (int*)malloc(3 * sizeof(int));
}

// 메모리 해제
for (int i = 0; i < 3; i++) {
    free(arr[i]);
}
free(arr);

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다