2016년 4월 8일 금요일

포인터에 기본 개념

포인터(Pointer)

-어렵게 생각할거 없이 그냥 말 그대로 포인터 즉 가르키고 있는거다. 
음...교수가 레이저로 화면 쏘면서 가르키고 있는것마냥

근데 이걸로 멀 하냐? - 코딩 하는 놈이 메모리의 일부를 직접 조작하고 컨트롤 할 수 있게 해줌.
이걸 터득하면? 동적메모리 할당, 배열이랑 포인터 관계(2차원 배열 동적할당 할때 난 소름 돋음),
                        연결리스트,트리 같은 자료구조 개념, 함수포인터 등등 이해하기 ㅅㅌㅊ

자 개념을 보장
int c='a'; 라고 딱 메모리 할당 하고 초기화도 이쁘게 시켜둠. 
그러면 메모리 상에서 어케 생겼냐면

이케 생김. 밑에 1 2 3 은 주소값이라고 가정하고 보셈.
그럼 c의 주소는 2임. 고럼 &c? 2 인거지 (&는 주소연산자다)
아 참고로 한 블록당 1Byte이고 어떤 메모리에 쓸지는 컴터가 알아서 지정해줌.
이케 주소도 알면 나중에 다시 찾아서 수정하거나 연산 할때 용이하겠지?
이게 배열에서도 통하는건데 만약에 내가
char arr[3]={10,20,30}을 입력했다고 치자.(arr[0] 주소 1이라고 생각하고)
그럼 내가 arr[2]의 주소까지 알아야 되나? 머 지금 처럼 크기가 작으면 상관없겠지
근데 존나 크면 개에바잖수. 해결책은?
걍 맨 처음 배열의 주소값만 알면되지.
arr[2]라고 해봤자 arr[0]의 주소값에서 계산하면 되잖아.
(이거 어케 주소값 접근하는지는 이따 밑에서 쓸거임.)
이걸 이쁘게 말하면
=>데이터가 들어있는 곳의 처음 주소는 1이고, 데이터 크기는 3Byte 구나. 

결국 변수명이 아닌 그 변수의 주소값으로 접근했을때 편의성은 무궁무진하다 이 말임.

예를 하나 더 들자면
int i=3;
int *p=&i;
이라고 치자. i의 주소가 101012이면 
p에는 101012가 저장되있는거야. 
그림으로 표현하면 이렇게 되지. 화살표로 걍 가르키면서 할 수 있지만 기본 개념잡는데는
이게 더 이해하기 쉬운거 같음. 



3가지 결론을 내리자면

1. 포인터는 변수이다.(단, 다른 변수의 주소값을 저장하는 변수)

2. 포인터는 오직 주솟값만 저장해서 8Byte이다.(void*,char* 모두 8바이트)
                         ->이건 64bit컴퓨터 기준으로 말한거임.

3. 포인터 변수로 어떤 연산할려면 *필요. (주소값으로 찾아간 후 변수 값 조정)
           

cf)*는 star 연산자(간접참조 연산자)이다. 
       - 포인터가 가르키고 있는 주소로 가서 그곳에 데이트럴 읽어 오거나 
        그곳에 있는 값을 변경하여 저장함.




아 참고로 포인터 연산도 쓰겠다.

위에 그림처럼 i라는 변수의 주소가 101012이고
p가 i의 주소를 담고 있다고 치자.
이때 p=p+1; 하면 p의 값은 어케 될까?
101013? 답은 노우다.

왜 그런지 그림을 한번 보장.

일단 기본적인 메모리 구조를 보자
(내가 그림 그리긴 힘들어서 퍼옴. 뿌잉) 
i라는 변수에는 지금 30이 저장되있고, 그 변수의 주소는 현재 4인거다.
p라는 변수는 i의 주소값을 저장하고 있는 상태이다. 
(저 p는 지금 32bit컴 기준으로 그린거)

이따 p=p+1을 했을때 p가 5라고 가정해보자. 그렇게 되면 그림으로





이렇게 된다. 무슨 일이 일어났는지 짐작이 가나? 
i의 메모리를 침범해버린다. 좆된거다.
제대로 된 그림을 보자.


얼마나 깔끔하고 이쁜가?
(p 주소값은 그림 상 안 겹치게 할려고 뒤로 밀어낸거임)

이걸로 유추할수 있는것은

->포인터 변수의 연산은 그 포인터 변수의 타입의 크기만큼 증감한다.

그렇다고 p=p+4라고 입력하라는게 아니다. (형변환을 생각해보자)

더 많은 예를 들어보자.


int i=10;
double d=40.0;
char c='c';

int *pi=&i;             //  i의 주소값 10으로 가정
double *pd=*d;  // d의 주소값 20으로 가정
char *pc=&c;      // c의 주소값 31로 가정

pi++;                  //int는 4바이트 -> 14
pd+=3;              //double은 8바이트 -> 44
pc-=9;               //char는 1바이트->22



굳!
다음은 포인터랑 배열 관계를 써보겠다.



댓글 없음:

댓글 쓰기