# C언어 포인터 심화: void*, 다중 포인터, 주소와 값

목차

C언어 포인터 심화: void*, 다중 포인터, 주소와 값

1. void* 포인터

#include <stdio.h>
int main() {
int a = 100;
double b = 3.14;
void *vp;
vp = &a;
printf("a = %d\n", *(int*)vp);
vp = &b;
printf("b = %.2f\n", *(double*)vp);
}
  • void*는 “주소를 담는 바구니” 로 비유 가능

  • 실제 값을 꺼낼 땐 반드시 형변환을 해줘야 함


2. 다중 포인터

  • 포인터를 가리키는 포인터.

  • 2차원 배열 동적 할당 같은 곳에서 많이 쓰임.

#include <stdio.h>
#include <stdlib.h>
int main() {
int rows = 3, cols = 4;
int **matrix = malloc(rows * sizeof(int*)); // 행 포인터 배열
for (int i = 0; i < rows; i++) {
matrix[i] = malloc(cols * sizeof(int)); // 각 행에 열 할당
}
// 값 넣기
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = i * cols + j;
printf("matrix[%d][%d] = %d (주소: %p)\n",
i, j, matrix[i][j], (void*)&matrix[i][j]);
}
}
// 메모리 해제
for (int i = 0; i < rows; i++) free(matrix[i]);
free(matrix);
}
  • matrix 자체는 int*들의 배열

  • 각 matrix[i]가 또 int 배열을 가리킴


3. 포인터와 주소/값 관계

int a = 10;
int *p = &a; // p에는 a의 주소 저장
p → a의 주소 저장
*p → 주소에 들어있는 값 (즉 10)
  • 정리:
    • 타입 옆에 * → 포인터 선언

    • 변수 앞에 * → 역참조 (값 꺼내기)

다음: C언어 배열 vs 포인터
My avatar

블로그에 방문해주셔서 감사합니다. 문의가 있으시면 thunderbizlab@gmail.com로 연락주세요.


댓글

C언어 시리즈

# C언어 - 다중포인터(2)

C언어 4 / 4
4 min read

알고리즘 문제나 개발할 땐 늘 자바나 자바스크립트만 썼는데, C언어로도 뭔가 코딩하는 능력을 키워야겠다는 생각이 들었다. 일요일을 맞아 직접 IDE를 켜고, C언어의 꽃이라 불리는 포인터로 노드 리스트를 구현해봤다.

더보기