강의/computer science

[ComputerScience] C언어와 포인터

하기싫지만어떡해해야지 2024. 9. 9. 16:10

이 게시글은

서울대학교 데이터사이언스대학원

조요한 교수님의

데이터사이언스 응용을 위한 컴퓨팅 강의를

학습을 위해 재구성하였습니다.


pointer는 C언어의 꽃이라고도 불린다

어렵고 복잡하지만 그만큼 중요하고 반드시 필요한 부분이기때문에

C언어 혹은 컴퓨터과학을 공부한다면

반드시 완벽하게 이해하고 넘어가야한다

 

그래서 강의에서 들은 Pointer에 대해서

정리해보도록 하겠당

 

Pointer란?

포인터란 어떤 변수의 메모리 주소를 담고있는 변수이다

말그대로 int, string같은 변수인데

그 데이터 타입이 메모리 주소인 것이다

 

<type> *<name>;

앞의 type이 메모리 주소에 담겨있는 변수의 데이터 타입

<name>은 포인터 변수의 이름이다

 

int *ptr;

이렇게 정의를 한다면

ptr은 어떤 int 값의 메모리 주소를 담고있는

포인터 변수라는 뜻이다

 

char *ptr;

은 마찬가지로

어떤 char 값의 메모리 주소를 담고있는

포인터 변수라는 뜻이다

 

 

pointer를 공부하다보면 포인터 변수를 정의하면서

*을 앞에 붙이거나 혹은 뒤에 붙이는 경우를 보게 될텐데

int *var

int* var

두 방식 모두 똑같은 의미이다

 

결국 어떤 int값의 메모리 주소를 담는 var라는

포인터 변수를 선언한 것

 

하지만 주의해야할 점은

포인터 변수를 연속으로 선언할 때

int* var1, var2;

이렇게 선언한다면

var1은 int값의 메모리 주소를 담은 포인터변수가 맞지만

var2는 그렇지 않다는 점을 주의해야한다

 

var2까지 포인터 변수로 만들어주려면

int *var1, *var2;

이런 방식으로 정의해주어야한다

 

 

Pointer Operator

 

 

int intVariable = 10;

이렇게 int변수를 선언했다고 가정하자

 

int *intPtr = &intVariable;

이라는 선언문은 무슨 뜻일까?

 

intPtr은 int값의 메모리 주소를 담는 포인터 변수이고

그 포인터 변수의 값에 &intVariable로 선언해주면

이는 intPtr이라는 포인터 변수에 intVariable값의

메모리 주소를 담겠다는 뜻이다

 

그렇다면 

printf("%d\n", *intPtr);

이라는 명령어를 사용하면 어떤 값을 출력할까?

 

%d는 정수형(int)값을 출력한다는 뜻이고

그 정수형 값은 *intPtr이 될 것이다

 

그냥 intPtr은 메모리 주소 값이니

*intPtr은 intPtr에 저장된 메모리 주소값에 들어가서

그 안에 있는 변수를 가져오겠다는 소리이다

 

따라서

printf("%d\n", *intPtr);

이 출력문의 결과는

intVariable값인 10이 될 것이다

 

 

위의 도식을 보면 조금 더 이해하기 쉬울 것이다

intPtr안에는 0xEE04 주소값이 들어가있고

0xEE04 주소값에 들어가보면

intVariable 값인 10이 있다

 

따라서

*intPtr = *intPtr + 2;의 값은

intVariable의 값에 2를 더한 값과

동일한 결과를 가져온다

 

그냥 단순하게

intPtr은 intVariable의 메모리 주소값

*intPtr은 intPtr에 담겨있는 메모리 주소값에

접근하면 나오는 intVariable값이라고

이해하면 편할 것 같다

 

 

또한, scanf로 사용자의 input을 포인터 변수에 담고싶을 경우

scanf("%d", &input);

이러한 방식으로 저장할 변수 명 앞에 반드시 &를 넣어줘서

주소값에 저장되도록 해야한다고 한다

 

 

Null Pointer

 

null pointer란 pointer변수에

null값을 넣어 초기화 하는 것을 말한다

 

위의 사진과 같이

int *ptr;

ptr = NULL;

로 선언했다고 치자

 

그럼 ptr이라는 포인터 변수는 어떤 주소값도

갖고 있지 않게 된다

 

ptr이라는 포인터 변수를 사용하기 전에 

NULL값으로 미리 초기화(initialize)를 해놓는 것인데

이는 C언어 코딩을 할 때 추천되는 방식이라고 한다

 

왜냐하면

ptr = NULL;로 초기화를 하는 순간

ptr을 위한 메모리 공간이 할당되는데

만약 pointer변수 선언과 동시에 바로 값을 넣으면

이전 메모리에 찌거기 값이 들어가있을 수 있어서

잘못된 결과가 들어갈 수도 있다고 한다

 

그래서 pointer변수는 사용하기 이전에

NULL로 초기화를 해준 뒤

원하는 값을 넣어주는 것이 좋다고 한다