
포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다.
포인터 변수를 선언할 때는 데이터 타입 뒤에 * 기호를 붙여 선언하며, 예를 들어 int *ptr;는 정수형 변수의 주소를 저장하기 위한 포인터입니다.
주요 연산자
주소 연산자(&): 변수의 메모리 주소를 반환합니다.
역참조 연산자(*): 포인터가 가리키는 주소의 값을 읽어옵니다.
#include <stdio.h>
int main() {
int value = 10; // 일반 변수 선언
int *ptr = &value; // 포인터 선언 및 초기화
printf("value: %d\n", value); // 일반 변수 출력
printf("Address of value: %p\n", (void*)&value); // 변수의 주소 출력
printf("Value via pointer: %d\n", *ptr); // 포인터를 통한 값 출력
return 0;
}
포인터를 사용하면 다음과 같은 작업을 수행할 수 있습니다:
배열 접근: 배열의 이름은 첫 번째 요소의 주소를 나타내므로 포인터 연산을 통해 배열 요소에 접근할 수 있습니다.
함수 인자로서의 사용: 변수의 주소를 전달하여 함수 내부에서 값을 변경할 수 있습니다.
동적 메모리 할당: malloc(), free() 등을 통한 메모리 할당 및 해제에 활용됩니다.
값 교환(swap) 함수 예제
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
printf("Before swap: x = %d, y = %d\n", x, y);
swap(&x, &y); // 주소를 함수에 전달
printf("After swap: x = %d, y = %d\n", x, y);
return 0;
}
이중 포인터는 포인터의 주소를 저장하는 포인터로, 즉 포인터를 가리키는 포인터입니다.
이중 포인터는 여러 단계의 간접 참조를 가능하게 하며, 주로 동적 메모리 할당 함수(예: getline())의 출력 매개변수 등에서 사용됩니다
#include <stdio.h>
int main() {
int num = 100;
int *ptr = #
int **dptr = &ptr;
printf("Value of num: %d\n", num);
printf("Value via single pointer: %d\n", *ptr);
printf("Value via double pointer: %d\n", **dptr);
return 0;
}
메모리 구조 예시
[메모리 주소]
0x1000: num = 10 ←─┐
0x2000: ptr = 0x1000 ←─┼─┐
0x3000: dptr = 0x2000 |