※읽다보면 헷갈리는 부분이 있을 수 있습니다. 그럴 때 거기에 막혀서 검색해보기 전에, 일단 모두 읽어보시길 추천합니다!
서술된 내용 뒤에 보충 설명을 달아놓은 경우가 많습니다^^
포인터란?
C에서 포인터 변수는
자료형* 변수명; <- 이렇게 선언되고는 합니다.
※포인터 변수 선언 방식
1. 자료형* 변수명;
2. 자료형 * 변수명;
3. 자료형 *변수명;
모두 가능합니다.
그러나 저는 1번 방식을 추천드립니다
저는 포인터=주소명, *포인터=주소에 도착한 포인터 라고 이해했습니다.
다음의 간단한 예제를 보며 이해를 해보겠습니다.(이해에 앞서, *연산자는 주소에 접근, &연산자는 주소를 반환합니다.)
int main(void) { int num = 5; int* ptr; //int형 포인터 변수 ptr 선언 ptr = # //포인터 변수 ptr에 num의 주소를 저장(&num은 num의 주소를 반환합니다) printf("주소명(포인터) = 0x%x \n", ptr); //주소명 표시 printf("주소에 도착한 포인터(*포인터) = %d \n", *ptr); //주소에 도착한 포인터 변수 ptr이 마치 num인듯이 행동 return 0; }
실행결과
주소를 16진수로 표현하는 컴퓨터 업계에서 주로 컴퓨터의 언어인 2진수로 쉽게 표현할 수 있고, 2진수를 줄여서 쓸 수 있기 때문이라 합니다.
좀 더 자세히 설명하자면(사실상 저는 위의 예제 하나면 포인터의 개념을 모두 설명했다 생각합니다.)
포인터 변수란 메모리의 주소 값을 저장하기 위한 변수입니다.
&연산자를 통해 num의 주소 값을 반환하여,
int형 포인터 변수 ptr에는 변수 num의 '시작번지 주소'가 저장됩니다.
그리고 *연산자를 이용해 포인터가 가르키는 메모리 공간에 접근합니다.(*ptr을 통해 num이 가르키는 메모리에 접근하여 num처럼 행동하였습니다)
이러면 포인터 개념 설명 끝!
+추가)
포인터 변수에도 다양한 타입이 존재합니다. int, double, char, unsigned int 등등..
포인터 변수에 이러한 타입이 왜 존재하느냐!하면 다음 코드를 보고 생각해봅시다.
double num = 3.14; int* pnum=#
double형의 크기는 8byte, int형의 크기는 4byte입니다.
포인터 변수 pnum는 int형이고 크기는4byte인데 여기에는 double형 num의 주소가 담겨있습니다. 이는
"num의 시작 주소부터 4byte를 읽겠다"를 의미합니다.
허나 num의 크기는 8byte이므로 포인터 변수 pnum은 *pnum으로 num에 접근하였을 때 읽다말아서(8byte 중에서 4byte만 읽어서) 원하는 값을 표시하지 않습니다.
따 라 서~~ 포인터 변수의 타입의 존재 이유는 * 연산자로 메모리를 올바르게 읽기 위해서라 할 수 있을것 같습니다.
++추추가)
잘못된 포인터의 사용과 널 포인터
다음의 포인터 선언의 잘못된 예를 보시고 무엇이 잘못되었는지 맞춰보시기 바랍니다.
int* ptr; *ptr = 0;
C언어에서 변수를 초기화하지 않고 선언 시, 쓰레기값이 저장됩니다.
int *ptr; 을 실행하였을 때, 포인터 변수 ptr에는 임의의 주소값(쓰레기 값)이 저장될 것 입니다.
*ptr = 0;을 실행한다면? 그 임의의 주소값에 0을 저장하겠죠.
근데 만약 *ptr이 가르키는 곳이 메모리상의 중요한 부분이였다면 어떻게 될까요?? 컴퓨터를 다신 사용할 수 없을지도 모릅니다..
다행히 요즘 운영체제는 이런 사고를 방지시켜준다 하네요.
그렇다면 올바르게 사용하려면 어떻게 해야할까요??
int* ptr = # //<- 처럼 선언과 동시에 초기화 시켜주던가, int* ptr = 0; int* ptr = NULL; //<- 처럼 주소값에 0또는 NULL을 저장합니다.
이는 0번지를 의미하는 것이 아닌, 아무것도 가리키지 않는다를 의미한답니다.
포인터 설명을 위한 포스팅은 계속 됩니다. 다음 포스팅을 참고하시길 바랍니다
이 포스터는 윤성우 열혈 C 프로그래밍을 참고하여 작성하였습니다.
궁금한 점은 댓글로 물어보시길 바랍니다.
부족한 점이 많으니 태클 환영합니다!
'C' 카테고리의 다른 글
c언어 포인터 const 선언 간단 정리 (0) | 2019.01.01 |
---|---|
c언어 함수의 인자 전달 call by value call by reference call by address (1) | 2018.12.31 |
C언어 literal과 배열, 문자열 (0) | 2018.12.23 |
c언어 홑따옴표와 쌍따옴표(작은 따옴표 큰 따옴표) (2) | 2018.12.23 |