코딩/C언어

[C언어] 포인터 정리

poiri3r 2025. 10. 13. 11:11

자료구조에 대한 공부를 하면서 포인터에 대해서 정리를 좀 해보겠습니다.

평소에 많이 헷갈리는 개념이지만 정말 너무너무 중요한 것 같습니다.

 

먼저 포인터는 변수의 메모리 주소값을 가리키는 특별한 변수입니다.

포인터 변수를 이용하여, 연결된 주소의 변수 영역을 액세스할 수 있습니다.

 

 

 

 

변수앞에 *를 붙임으로써 선언할 수 있고 주소를 연결할 변수 앞에는 &를 붙여줍니다.

#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