ipwn

C) 포인터 본문

Programming

C) 포인터

ipwn 2017. 12. 18. 23:06

1.포인터의 개념


포인터는 어떠한 메모리 값의 주소를 저장하는 변수를 의미 합니다.


쉽게는 데이터의 위치를 가르켜주는 것 입니다.


예를 들어 , 맛스타는 1200원이라는 메모리 값 주소값은 학교의 매점이고,


다른 편의점 CU에 있는 1200원의 과자의 1200원이라는 메모리 값 주소값은 


CU인 것 처럼, 이렇게 같은 메모리 값이라도 주소는 각자 다 다르고 , 


이 다른 주소를 저장해 주는것을 우리는 포인터라고 합니다.


2.포인터의 변수 선언 방법


1
2
3
4
5
6
7
#include<stdio.h>
int main() {
    int 맛스타=1200;
    int *ptr맛스타 = &맛스타;
 
    printf("%d원 짜리 맛스타의 주소는 %#x 입니다", 맛스타, ptr맛스타);
}
cs

 

이와 같은 방식으로 포인터의 변수를 선언하는데요,



실행을 하면 이와 같이,


맛스타라는 변수에 들어있는 메모리의 주소값을 불러와주는 형식입니다.


3.포인터의 초기화


어떤 변수는 초기화를 하는 방법은 똑같이 선언함과 동시에 하거나,


선언한 뒤 그 후에 하는 방식 두 가지가 있는데요


그렇다면 만약 포인터를 이런 식으로 초기화를 한다면 어떻게 될까요?


1
2
3
4
5
6
7
#include<stdio.h>
int main() {
    int *a;
    *= 200;
    printf("%d"*a);
    return 0;
}

cs  


컴파일은 제대로 됩니다!! 그렇다면 출력은 어떻게 될까요??


물론 제대로 출력이 된다면 좋겠지만.... 이걸 실행시키면




위와같이 에러가떠버립니다.. 왜일까요? 설명을 하자면,


포인터 변수 a가 초기화가 되지 않아서인데요 


우리는 분명 초기화를 했는데 왜 안되는걸까요?


바로 a가 가르키는 주소가 어디인지 몰라서 함부로 대입을 하지 못 한 겁니다.


이 a는 분명 메모리 어딘가를 가르켜주고 있기는 하지만 어디인지 몰라서 


초기화를 하지 못한거죠


만약 a가 가르킨 어딘가가 컴퓨터 시스템의 엄청나게 중요한 부분이었는데 


 곳에 함부로 200을 대입해버리면??


어떤 일이 벌어날지 모르겠죠??


그러므로 포인터 변수는 아래와 같이 초기화 해줘야 합니다.


1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main() {
    int X = 300;
    int *= &X;
    printf("X는 %d\n", X);
    printf("X의 주소는 %#x\n"&X);
    printf("포인터 변수 a는 %#x\n", a);
    printf("포인터 변수 a가 가르키는 값은 %d\n"*a);
    return 0;
}
cs


이와 같은 코드를 실행시켜 보면 제대로 아래와 같이 실행된다는 것을 


알 수 있습니다.



이렇게 아주 잘 실행이 됩니다.



4.포인터가 필요한 이유


이 쯤 됐으면 모든 변수들은 메모리 저장장소를 할당 받아서 


사용된다는 건 알 수 있을 것입니다.


그 모든 변수의 저장과 참조는 각 변수가 저장 됐거나 


저장 될 주소를 알아야 가능합니다


지금까지 우리는 변수자체만을 참조할때는 


그 변수가 저장된 메모리의 주소는 필요 없었습니다. 


그러나 실제로 컴퓨터는 변수를 참조할 때 그 변수가 


저장되어 있는 주소를 먼저 찾아내고 그 다음

그 주소가 가리키는 내용을 참조하게 됩니다. 여기서 그 변수의 주소를

저장하거나 사용하기 위한 변수가 포인터입니다. 즉 포인터란 주소를

관리하기 위한 변수입니다. 포인터는 실제 값을 사용하는 것이

어렵거나 바람직하지 못한 경우 사용됩니다. 


5.포인터사용의 예시

이 보고서  뒤에 올릴 스왑(swap) 함수를 포인터로 구현하는 것도 하나의 


포인터의 예제라고 볼 수 있는데요,


일단 다른 예시를 하나 써 보자면, 아래와 같은 코드를 짤 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main() {
    int a[10];
    int i;
    int *b;
    for (i = 0; i < 10++i) {
        b = &a[i];
        printf("a[%d]의 주소값 %#x\n", i, b);
    }
    return 0;
}
cs


a[10]까지 들어있는 모든 배열의 주소값을 b에 대입해서 출력하는 코드입니다.


실행을 해 보면 결과는 아래와 같이 나옵니다.


배열의 0 ~ 9 인덱스까지의 주솟값을 출력해주었는데 다 비슷비슷한 위치의 


주솟값을 갖고 있습니다.


이러한 이유는 배열은 첫 인덱스부터 끝 인덱스까지 주욱 데이터 공간을 


사용하기 때문입니다.


그리고 할당된 공간의 주솟값이 4씩 차이나는 이유도 int 자료형 배열이기에 


4 byte씩 공간을 할당받기 때문입니다.

'Programming' 카테고리의 다른 글

C) 코드업 함수문제 풀이  (0) 2017.12.18
C) swap 함수 구현  (0) 2017.12.18
C) strlen, strcmp, strcpy 함수 조사 및 구현  (0) 2017.12.18
C) 함수란 ?  (0) 2017.12.18
C) 배열, 2차원 배열이란?  (0) 2017.12.18
Comments