C언어

2. 포인터

boseong_Park 2022. 9. 14. 21:15

2-1. 포인터란?

- 변수나 여러가지 것들이 저장되어있는 메모리공간의 주소값을 저장해주는 단위이다.

- 포인터는 변수형태와 상수형태 모두 존재한다. 이는 뒤에서 자세히 다루겠다

- 주소값은 그 주소값이 가리키고 있는 자료의 자료형과는 관계없이 항상 정수형이다.--> int의 주소값, float의 주소값, double의 주소값, char의 주소값...등등등 모두 다 정수 형태이다. 값만 다를 뿐이다.

- 변수의 주소값은 변수의 자료형과 맞는 포인터 변수에 저장되어야 한다.--> int형 변수의 주소값은 int형 포인터 변수에, float형 변수의 주소값은 float형 포인터 변수에... 등등에 저장되어야 한다.

 

그럼 우리는 두 가지 질문이 생길 수 있다.

1. 주소값은 변수의 자료형과는 무관하게 무조건 정수이다. 그렇다면 왜 주소값은 정수형 변수에 담지 않고 포인터 변수에 담을까?

2. 주소값은 변수의 자료형과는 무관하게 무조건 정수이며, 크기도 같다 (--> 포인터 변수의 크기는 운영체제에 따라 달라진다. ex> 32bit 시스템: 4byte / 64bit 시스템: 8byte) 그런데 왜 번거롭게 굳이 자료형에 따라 구분해서 포인터 변수를 다르게 선언해야되는가? 같은 운영체제내에서 크기가 같고 형식도 같다면 저장하는 포인터 변수의 형식은 구분해줄 필요가 없지 않은가?

 

미리 답을 하자면

1. 일반 정수형 변수는 주소값을 저장할 수는 있지만, 그 주소로의 접근이 불가능하다

2. 자료형을 구분해줘야만 포인터 변수에 포인터 변수가 가리키고 있는 변수의 자료형에 대한 정보가 포함되어서 메모리에 접근 시, 용이하게 사용할 수 있다.

 

C언어를 능숙하게 사용하시는 분들이라면 당연히 바보같은 질문들이라고 생각하겠다. 뒤에 포인터의 내용까지만 공부를 하고 정리하는 내 입장에서만 해도 너무 당연한 것들이기 때문이다. 그러나 처음 공부할 때 이 질문들에 초점을 맞추고 공부를 했으므로 앞으로 이 글을 보고 다시 공부를 할 때 위 두 질문을 중점적으로 생각하며 공부하면 좋겠다.

 

2-2 포인터 변수의 선언 방법 및 초기화 방법

-  * : 포인터 선언 연산자 / 메모리 접근 연산자

- & : 주소 반환 연산자 --> 변수의 주소값을 반환해준다

int num = 10;
int* ptr = # // &num을 통해 반환된 num의 주소값을 '*'을 통해 선언된 포인터변수 ptr에 저장
*ptr = 120; // '*' 연산을 통해 ptr포인터 변수가 가리키고 있는 변수에 접근하여 값을 바꾼다
printf("%d", *ptr); // '*'연산을 통해 ptr포인터 변수가 가리키고 있는 변수에 접근하여 출력한다