포인터의 사용형식
C언어에서 포인터(pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 부릅니다.
char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장합니다.
포인터의 사용형식은 다음과 같다.
int n = 100; // 변수의 선언 int *ptr = &n; // 포인터의 선언 |
이때 주의할 점으로는 자료형은 서로 다른 바이트로 구성되므로 자료형 마다 해당 메모리 영역을 가리지키는 포인트의 정보도 달라야 한다는 것이다.
다만, 자료형의 크기에 따라 포인터의 크기가 달라지는 것은 아니다.
자료형은 종류에 따라 1바이트 혹은 4바이트 등 다르지만 포인터의 크기는 32비트 기준 동일하게 4바이트다.
포인터의 크기는 32 비트 기준 동일하게 4 바이트
포인트의 사용방법을 그림으로 표현하면 아래와 같다.
포인트의 개념을 한 번에 정리하고 확인할 수 있는 그림이므로 잘 기억하도록 하자.
포인터의 예제는 다음과 같다.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
int num = 10;
int *pnum = #
printf("%d",*pnum);
}
포인터 또한 일반 변수처럼 포인터 변수를 선언하며 값을 초기화할 수 있다.
이때 주의할 점은 포인터 변수를 초기화하고 변수의 주소를 할당할 때 사용하는 * 기호와 포인터를 참조한 변수를 가져올 때의 * 기호는 다른 의미이다.
int *pnum = # | num의 주소를 pnum이라는 포인터 변수에 저장한다. (해당 변수는 포인터임을 선언) |
printf("%d",*pnum); | pnum이란 포인터 변수에 저장된 주소의 값을 참조한다. |
포인터가 실제 영향력을 발휘하기 위해서는 포인터 변수에 무언가를 가리키는 값이 있어야 한다. 따라서 포인터 변수는 & 연산자를 만나야 비로소 제 역할을 할 수 있는 것이다.
또한 위의 예제에서 * 기호는 역참조 연산자로 포인터가 가리키는 곳의 값을 의미한다.
포인터의 다른 예제를 확인하자.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
int num = 10;
int *pnum = #
//실제 num의 메모리 주소와 실제값
printf("num의 메모리 주소: 0x%p | num의 실제값: %d\n",&num,num);
//실제 pnum의 메모리 주소와 실제값
printf("pnum의 메모리 주소: 0x%p | pnum의 값: 0x%p\n",&pnum,pnum);
//pnum이 가리키는 곳의 값과 num의 값
printf("pnum이 가리키는 곳의 값: %d | num의 값: %d\n",*pnum,num);
//pnum의 메모리 주소와 실제값
printf("pnum의 메모리 주소: 0x%p | pnum의 주소값: 0x%p | pnum의 실제값: %d",&pnum,pnum,*pnum);
}
이때 포인터를 출력하는 형식은 %d가 아닌 %p임을 유의하자.
실제 출력을 확인하면 위에 언급한 사진과 알고리즘이 일치함을 알 수 있다.
다시 정리하자면 변수는 변수에 저장된 값과 주소를 가지고 있으며 포인터는 선언한 변수의 주소를 '저장'한다. 이때 포인터는 선언한 변수의 주소에 직접 참조하여 해당 주소가 가지고 있는 변수의 값을 알 수 있다. 이 과정에서 포인터 또한 메모리를 차지하므로 포인터 스스로도 주소를 가지게 되는데 이때의 주소는 미리 선언한 변수의 주소와 다를 수밖에 없다.
포인터를 사용하는 이유는 포인터는 수정에 용이하기 때문이다. 이는 추후에 다시 다루도록 하자.
'Datastructure > [Algorithm problem]' 카테고리의 다른 글
#1-6. 포인터의 활용 (0) | 2023.09.04 |
---|---|
#1-5. 포인터 배열과 포인터 연산 (0) | 2023.09.03 |
#1-4. 배열과 포인터 (0) | 2023.09.03 |
#1-2. 배열과 검색 (0) | 2023.08.31 |
#1-1. 자료형의 크기 (0) | 2023.08.30 |