자료구조에 대한 공부를 하면서 포인터에 대해서 정리를 좀 해보겠습니다.
평소에 많이 헷갈리는 개념이지만 정말 너무너무 중요한 것 같습니다.
먼저 포인터는 변수의 메모리 주소값을 가리키는 특별한 변수입니다.
포인터 변수를 이용하여, 연결된 주소의 변수 영역을 액세스할 수 있습니다.

변수앞에 *를 붙임으로써 선언할 수 있고 주소를 연결할 변수 앞에는 &를 붙여줍니다.
#include <stdio.h>
int main() {
int i;
int* ptr = &i;
printf("%p ptr);
}
아주 간단하게 포인터 연산자를 선언하고 출력해보면

다음과 같이 포인터 주소가 출력됩니다.
만약에 printf에서 %p가 아닌 %d로 정수값 출력을 하게되면

이런식으로 -값이 나오게 되는데 %d는 int형인 4바이트 출력용이므로 저번에 공부했던 OOB의 발생이 일어나서 음수로 보이게 됩니다.
포인터를 다양한 자료형으로 선언할 수 있는데
char *ptr의 경우는 1바이트의 char형 변수의 주소를 저장하고
int *ptr의 경우는 4바이트의 int형 변수의 주소를 저장할 포인터를 선언한 예입니다.
다음은 주소연산자 & 입니다.
변수의 주소를 얻끼 위해 사용합니다
#include <stdio.h>
int main() {
int i;
int* ptr = &i;
printf("%p \n", ptr);
printf("%p", &i);
}
방금 코드에 변수 i에 대한 주소를 출력하면

포인터변수가 가르키는 값이 i의 주소값이랑 일치하는것을 확인할 수 있습니다.
포인터 연산입니다.
포인터를 할당하고 참조 연산자를 할당하면 포인터를 사용해 연결된 변수의 값을 변경할 수 있습니다.
다음과 같은 코드를 보겠습니다.
#include <stdio.h>
int main() {
int i = 20;
int* ptr = &i;
printf("%d\n", i);
*ptr = 10;
printf("%d", i);
}

*ptr의 값을 변경함으로써 i에 저장된 값을 변경할 수 있습니다.
포인터의 초기화 방법입니다.
1. 주소 연산자를 사용하여 변수 주소를 지정합니다.
int i;
int *ptr = &i;
2. 동적 메모리를 할당하고 그 시작 주소를 포인터값으로 지정합니다.
char *ptr = (*char)malloc(100);
3.문자형 포인터에 문자열의 시작 주소를 지정합니다.
char *ptr = "poirier";
4. 배열 이름을 이용하여 배열 시작 주소를 지정합니다.
char A[100];
char *ptr = A;
5.배열의 첫번째 요소의 주소를 이용하여 배열 시작 주소를 지정합니다.
char A[100];
char *ptr = &A[0];
포인터로 배열을 선언할 선언할 수도 있습니다.
여러개의 포인터를 하나의 배열로 구성하면 배열의 특징과 포인터의 특징을 모두 활용할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
char* ptr[3] = { {"Dreams"}, {"Comes"}, {"True"} };
printf("%c \n", ptr[0][2]);
}
위와 같이 ptr[0][2]를 출력하면 오류가 날 줄 알았는데

이렇게 정상적으로 출력이 됩니다.
이렇게 간단하게 포인터 변수에 대해 알아봤습니다.
주소접근을 할 수 있다는게 굉장히 강력하고 효율적이지만 보안에서는 치명적인 약점을 많이 발생시키는 것 같기도 합니다.
읽어주셔서 감사합니다~
'코딩 > C언어' 카테고리의 다른 글
| [C언어] 구조체 (0) | 2025.10.13 |
|---|---|
| [C언어] Memory Allocator(ptmalloc2, 동적할당 동작 과정) (0) | 2025.10.06 |
| [C언어] 메모리의 동적 할당 (0) | 2025.10.06 |