[CS_study] 포인터

나라리야·2021년 4월 27일
0

CS_study

목록 보기
9/18
post-thumbnail

포인터

지금까지의 변수는 그 자체로 자신의 자료형에 맞는 값을 저장했었다.
포인터(Pointer) 변수는 특이한 변수로, 메모리 주소를 저장한다.

포인터 개념

포인터는 특정한 변수 자체가 존재하는 메모리 주소의 값을 가진다.
따라서 아래 예제에서는 기존에 a를 이용해도 5라는 값을 찾을 수 있지만 포인터 변수인 b를 이용해서도 5라는 값을 찾을 수 있다는 것을 보여준다.

int *b = &a;처럼 '선언할 때' 쓰는 *는 포인터 변수임을 알려주기 위한 목적을가진다.
이후에 *b라고 쓰게 되면, 이것은 포인터 변수 b가 가리키는 주소의 값을 의미한다.
다시 말해 위 예제에서 5라는 값 자체가 된다.

포인터 관련 연산자

선언할 때와 선언 이후의 포인터 연산자(*)는 생긴것만 같을 뿐 기능은 다르다


실제로 int a = 5;와 같이 변수를 할당하면 메모리 주소상에서는 다음과 같이 기록될 수 있다.
int형은 4바이트를 차지하므로 메모리 주소를 1바이트 씩 표현할 때 4칸을 차지한다.


포인터의 기능

1) 포인터는 컴퓨터 시스템의 특정한 메모리에 바로 접근할 수 있다.
2) 따라서 기존에 존재하던 중요한 메모리 영역에 접근하지 않도록 주의 해야한다.
3) 아래와 같은 코드는 매우 위험한 코드이다.

int *a = 0x33484735;
*a = 0;  // 주소값이 달라진다. 

4) 포인터는 단지 특정한 메모리 주소를 담고있는 변수일 뿐이다.
5) 따라서 포인터는 다중으로 사용할 수 있다.

#include <stdio.h>

int main(void) {
	int a = 5;
	int *b = &a;
	int **c = &b;  //포인터 변수를 다중으로 사용
    printf("%d\n", **c); 
	system("pause");
}

여기서 잠깐!
배열과 포인터는 사실 동일하다.
배열을 선언한 이후에는 그 이름 자체가 포인터 변수와 동일하다고 볼 수 있다.
그래서 배열 선언 이후에 그 이름 자체를 포인터 변수처럼 사용할 수 있다.
아래 예제를 살펴보자

예제)

#include <stdio.h>

int main(void) {
	int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
	int *b = a;
	printf("%d\n", b[2]); //포인터 b변수는 a 배열의 주소값을 가짐
	system("pause"); // 2번째 인덱스에 있는 값인 3이 출력됨 
}

1) 포인터는 특정한 변수가 메모리 상에 존재하는 위치 주소를 저장합니다.
2) 포인터는 특정한 메모리 주소에 바로 접근할 수 있으므로 조심스럽게 사용해야 합니다.

profile
Code의 美를 추구하는 개발자 🪞

0개의 댓글