LetITGo

C언어 포인터 Pointer에 대해 알아봅시다 본문

전공지식/자료구조와 알고리즘

C언어 포인터 Pointer에 대해 알아봅시다

올라프의 취미 2020. 8. 28. 10:30
728x90

안녕하세요 오늘은 C언어에서 포인터에 대해서 알아보겠습니다. 포인터는 저도 솔직히 많이 어려워했던 부분이라서 열심히 공부했습니다. 처음에는 쉽게 배우면 앞으로 프로그래밍하면서 쉽고 잘 이용할 것 같습니다.

포인터 (Pointer)는 주소를 저장하고 있는 변수입니다. 그럼 변수의 주소에 대해서 알아야 합니다. 변수의 주소를 계산해주는 연산자는 &입니다. 그래서 변수 i의 주소는 &i입니다.

이제 포인터를 선언하는 법에 대해서 알아보겠습니다. 포인터는 선언할 때 int *p; 처럼 선언합니다. 해석은 *p가 가리키는 내용은 "정수이다."입니다. int와 같은 자료형은 바뀔 수 있습니다.

 포인터가 헷갈릴 수 있으므로 정리를 해보았습니다. a는 정수형 변수입니다. p는 포인터 변수입니다. 포인터 p에 정수 a의 주소를 대입했으므로 p는 정수 a의 주소를 가지고 있습니다.

포인터는 다양하게 선언할 수 있습니다. 정수형 int, 실수형 float, 문자형 char 등 다양하게 선언할 수 있습니다.

계속 *가 사용되고 있는데 무엇을 의미할까요? *는 간접 참조 연산자입니다. printf(“%d”, *p); 을 실행하면 포인터 p가 가리키는 변수의 값을 반환하여 출력합니다. 그래서 *는 포인터가 가리키는 변수의 값을 반환하는 역할을 합니다.
 실제로 프로그램을 실행해보면 p는 a의 주소를 가지고 있으므로 9434872라는 정수가 나오고 *p는 변수 a가 가지고 있는 정수 30이 출력됩니다.

 그럼 포인터를 변경해보겠습니다.
p에는 변수 a의 주소가 저장되어 있습니다.
p를 출력하면 a의 주소가 나옵니다.
*p를 출력하면 변수 a인 30이 나옵니다.
이때까지는 p와 q가 같습니다.

p에 +1을 해보겠습니다. q는 *q를 +1해 보았습니다.
p를 출력하면 정수형 int는 4bit 이기 때문에 주소에 4가 추가됩니다.
*p를 출력하면 주소가 바뀌었기 때문에 a를 가르치지 않습니다. 그래서 전혀 다른 수가 나옵니다.

q에서는 *q를 변경하였기 때문에 주소는 변경되지 않습니다.
q를 출력하면 주소는 그대로입니다.
*q는 주소가 가리키는 변수를 +1을 했기 때문에 31이 나옵니다.

이제 포인터가 정확히 이해되었을 것입니다.

 포인터를 이용할 때는 조심할 점이 있습니다.
초기화가 되지 않은 상황에서는 사용하면 안 됩니다. 흔히 정수형 변수를 선언하고 초기화되지 않은 상황에서는 대입을 할 수 있지만, 포인터에서는 위험합니다. 그 이유는 초기화되지 않은 포인터는 가리키고 있는 변수가 없으므로 대입할 수 없기 때문입니다.


오늘은 포인터에 대해서 알아보았습니다. 포인터는 구조체와 함께 사용할 수도 있고 특히 자료구조를 배울 때는 리스트에서도 쓰이고 앞으로도 계속 쓰일 내용입니다. 이번에 확실히 배워놓는 것이 중요합니다.
 간단하게 C언어를 배울 때는 포인터를 잘 몰라도 될 수도 있지만 앞으로 적용될 프로그램에는 포인터가 매우 중요합니다!!!

 다음 시간에는 구조체에 대해 알아보고 그다음에는 구조체와 포인터가 어떻게 같이 적용되는지에 대해서 알아보겠습니다.

Comments