티스토리 뷰
목차
C언어 포인터 이해하기
최근 JAVA나 C# 같은 언어는 GC 기능이 메모리 관리할 필요가 없습니다.
하지만 OS 내장 프로그램을 만들고 싶을 때 피할 수 없는 것이 C언어입니다.
다른 프로그래밍 언어를 배우거나 배운 분들에게 낯설고 때로는 불쾌한 기분도 들게 만드는 게 C언어 포인터입니다. C언어를 배우려면 다른 언어에는 없는 포인터는 꼭 이해할 필요가 있습니다.
한 눈에 확인하는 포인터와 연산자 - C++ 포인터도 똑같은 개념
포인터 배우기 전에
포인터 배우기 전에 pointer를 이해하는데 필요한 것이 하나 있습니다.
바로 주소입니다.
더 쉽게 말하자면 메모리 장소(위치)입니다.
프로그램을 작성할 때 변수 등을 선언하면 해당 변수는 데이터 형식에 따라 필요한 만큼 메모리 위치(크기)를 확보합니다.
이점은 C언어뿐만 아니라 다른 언어도 마찬가지이므로 기억해 두시면 손해 볼 것은 없습니다.
C언어에서 주소 위치는 변수 앞에 "&" 기호를 붙여 표현합니다. 덧붙여 &를 주소 연산자라고 부릅니다.
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main () { int a = 0; printf("변수 a의 주소는 % d", &a); return 0 ; } | cs |
포인터가 뭐야?
주소가 나왔습니다. 왜 포인터 이야기하는데 주소가 나올까요?
대답은 간단합니다. 주소 위치에 변수를 할당하기 때문입니다.
그리고 주소를 저장하고 있는 변수를 "포인터 Pointer"라고 합니다.
위 코드에서 변수 a의 주소는 &a로 표현했습니다. 이젠 주소를 나타내는 &a에 포인터를 대입해 봅시다.
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int main() { int a = 0; int *pa ; // 포인터 선언 pa = &a; //이 포인터에 주소 할당 *pa = 1; // a의 주소에 1을 대입, 즉 a에 1을 대입하는 것 return 0 ; } | cs |
간단합니다.
위의 소스 코드처럼 변수 pa와 같이 포인터 선언을 합니다. 또한 "*"를 포인터 연산자라고 합니다.
포인터를 선언한 후 주소를 대입해 봅시다.
일반 콘솔 프로그램이라면 컴파일 오류 또는 경고가 발생합니다. 만약 exe 파일이 있다면 실행하지 마세요.
정의되지 않은 pointer 에 값을 할당한다는 것은 매우 위험한 것으로 시스템 자체에 오류를 유발할 수 있습니다.
NULL = 널
포인터의 포인터 pointer of pointer
재밌게도, 포인터의 포인터도 얻을 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> int main() { int a = 0; int *pa; // 포인터 선언 int **pp; // 포인터의 포인터 선언 pp = &pa; // 이 포인터에 주소를 할당 **pp = 1; // 포인터의 주소 대입 pa = &a; // p의 주소에 1을 대입, 즉 a에 1을 대입 return 0; } | cs |
마지막으로
포인터의 개념을 이해하셨나요?
아직 이해가 안 된다면, Java를 예로 들어볼게요.
자바 입장에서 말하자면 C언어 포인터는 참조와 비슷합니다.
예를 들어 자바에서,
1 2 3 4 | int[] a = {1,2,3,4,5}; int[] b; b=a; | cs |
같은 코드를 작성한 것입니다.
b = a에서 배열 a의 주소를 배열 b에 전달하므로 필연적으로 a, b는 같은 값을 보유합니다.
그래서 어느 한쪽을 변경하면 다른 쪽도 변경됩니다.
포인터는 이와 같은 개념입니다.
포인터 개념 정리 및 이해하기
C언어 공부 글 더보기
마이크로프로세서 주소 지정 방식
https://codingcoding.tistory.com/596
Call by Reference, Vale, Address 차이
https://codingcoding.tistory.com/866
동적 메모리 할당 방법
https://codingcoding.tistory.com/645
정수형 변수 int 배우기