ipwn
C) 포인터 본문
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; *a = 200; printf("%d", *a); return 0; } |
컴파일은 제대로 됩니다!! 그렇다면 출력은 어떻게 될까요??
물론 제대로 출력이 된다면 좋겠지만.... 이걸 실행시키면
위와같이 에러가떠버립니다.. 왜일까요? 설명을 하자면,
포인터 변수 a가 초기화가 되지 않아서인데요
우리는 분명 초기화를 했는데 왜 안되는걸까요?
바로 a가 가르키는 주소가 어디인지 몰라서 함부로 대입을 하지 못 한 겁니다.
이 a는 분명 메모리 어딘가를 가르켜주고 있기는 하지만 어디인지 몰라서
초기화를 하지 못한거죠
만약 a가 가르킨 어딘가가 컴퓨터 시스템의 엄청나게 중요한 부분이었는데
그 곳에 함부로 200을 대입해버리면??
어떤 일이 벌어날지 모르겠죠??
그러므로 포인터 변수는 아래와 같이 초기화 해줘야 합니다.
1 2 3 4 5 6 7 8 9 10 | #include<stdio.h> int main() { int X = 300; int *a = &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 |