[C언어] 포인터 기본적인 사용으로 이해하고, 초기화 방법 알기
- Language/C언어
- 2018. 6. 21.
포인터 이해하기
C언어는 포인터를 이용해 메모리에 직접 접근이 가능하다 그래서 Love레벨 언어의 특성을 가진다고 말한다.
메모리에 직접 접근이 가능하게 하려면 주소값을 저장할 변수가 필요한데 이것이 포인터 변수이다. 다음 코드를 보며 이해 해보자
#include<stdio.h> int main(void){ int num = 7; int * pnum; pnum = # return 0; } | cs |
int * pnum 이 바로 주소값을 저장할 포인터 변수이다. pnum은 변수명이고 int는 int형 변수의 주소값을 저장한다는 것이다.
pnum = &num에서 &num은 num의 주소값이고 이 값을 pnum에 대입한 것이다.
&연산자는 피 연산자의 주소값을 반환하는 연산자이다.
저 위에코드를 한줄로 표현하면 "포인터 변수 pnum이 int형 변수 num을 가리킨다." 라고 표현 할 수 있다.
포인터 변수의 크기는 32비트 시스템에는 4바이트가 될 수 있고 64비트 시스템에서는 8바이트가 될 수도 있다. 이렇듯 포인터 변수의 크기가 주소 값의 크
기와 일치해야 주소 값을 저장할 수있다. 따라서 주소 값의 크기와 포인터 변수의 크기가 동일 한 것은 당연하다.
포인터 변수 선언의 기본 공식과, 자료형
type * ptr; | cs |
포인터 변수는 단순히 주소값을 저장하는 변수인데 자료형이 있다는 것은 자신이 가리키고 있는 변수의 타입을 뜻하는 것이다. 단순히 주소값을 아는 것은 필요가 없다 주소를 통해서 데이터를 이용하는것이 목적이다. 주소값은 10진수나 16진수등 자신이 원하는 진법으로 볼 수 있다.
#include <stdio.h> int main() { int num = 7; int * pnum; pnum = # printf("pnum : %d\n", pnum); printf("*pnum : %d\n", *pnum); return 0; } | cs |
pnum은 num의 주소값이다. 하지만 *pnum을 찍었더니 num의 값이 나온다, 즉 *연산자는 포인터가 가리키는 값이된다.
그림을 보면서 다시 설명하자면 pnum은 num의 주소값을 가지고 있고 *pnum을 출력하면 자신이 가리키고 있는 데이터가 나오는 것이다. 자료형도 이 데이터에 맞춰져 있는 것이다. 그러면 * 연산자를 이용하여 num의 값을 바꿀 수 있다.
#include <stdio.h> int main() { int num = 7; int * pnum; pnum = # printf("pnum : %d\n", pnum); printf("*pnum : %d\n", *pnum); *pnum = 10; printf("num : %d\n", num); return 0; } | cs |
포인터는 주소를 이용하여 사용하기 때문에 참조형 변수라고 할 수 있다. 그래서 *pnum은 자신이 가리키고 있는 데이터이고 *pnum의 값을 바꿔서 num의 값을 바꿀 수 있다.
정리한 바에 의해 *pnum의 의미를 이렇게 설명할 수 있다.
"포인터 변수 pnum이 가리키는 메모리 공간인 변수 num에 접근"
포인터 변수 초기화 방법
포인터 변수도 똑같은 변수이기 때문에 선언만하고 초기화하지 않으면, 포인터 변수는 쓰레기 값으로 초기화된다. 그렇다고 아무값이나 대입하면 치명적인 결과로 이어질 수도 있다. 만약 *ptr 에 200을 대입했다고 치자 주소 200번지에 머가 있을지 모른다. 만약 가리키는 곳이 메모리 공간에서 매우 중요한 위치였다면 시스템 전체에 치명적인 문제를 일으킬수 있지만 다행이도 미연에 방지해준다. 그래서 포인터 값이 초기화는 0이나, null로 해줘야 한다.
#include <stdio.h> int main() { int * ptr1 = 0; int * ptr2 = NULL; return 0; } | cs |
위에서 ptr1을 초기화하는 값 0을 가리켜 '널 포인터'라 한다. 이는 0번지를 위미하는 것이 아니다. 이것이 의미하는 바는 "아무데도 가리키지 않는다!" 이다. ptr2도 NULL로 초기화 하몄지만 실제로도 이는 상수 0으로 정의되어 있다.
윤성우, 『열혈 C프로그래밍』, ORANGE MEDIA
'Language > C언어' 카테고리의 다른 글
[C언어] Visual Studio 2017 community 버젼 C언어 공부용 콘솔 응용 프로그램 만들고, hello world 출력 (1) | 2018.06.22 |
---|---|
[C언어] 포인터와 배열의 관계와 인덱스활용, 포인터를 활용한 문자열 표현 (0) | 2018.06.22 |