반응형
1. 포인터 변수?
포인터 변수란 주소 값의 저장을 위해 선언되는 변수이다.
2. 주소 값 얻기(&연산자)
&연산자는 피연산자의 시작 주소 값을 반환한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | int main(void) { int num1=3; char num2='A'; double num3=3.15; printf("num1의 저장위치: %#x \n", &num1); printf("num2의 저장위치: %#x \n", &num2); printf("num3의 저장위치: %#x \n\n", &num3); printf("num1의 주소 값 크기: %d \n", sizeof(&num1)); printf("num2의 주소 값 크기: %d \n", sizeof(&num2)); printf("num3의 주소 값 크기: %d \n\n", sizeof(&num3)); return 0; } | cs |
1 2 3 4 5 6 7 8 | num1의 저장위치: 0x62fe4c num2의 저장위치: 0x62fe4b num3의 저장위치: 0x62fe40 num1의 주소 값 크기: 4 num2의 주소 값 크기: 4 num3의 주소 값 크기: 4 | cs |
num1, num2, num3의 앞에 &연산자를 붙여서, 주소값을 얻고 있다.
주소 값의 크기는 32비트 시스템 기준으로 4바이트로 표현되고 있다.
3. 포인터 변수 선언 및 초기화
포인터 변수의 선언은 다음과 같이 하면된다.
int * ptr; * 을 추가함으로써 ptr은 int형 변수가 아니라,
int형 변수의 주소 값을 저장할 수 있는 포인터 변수이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | int main(void) { int num1 = 3; char num2='A'; double num3=3.15; int * ptr1=&num1;//int형 포인터 변수 선언 char * ptr2=&num2;//char형 포인터 변수 선언 double * ptr3=&num3;//dobule형 포인터 변수 선언 printf("num1의 저장위치: %#x \n", ptr1); printf("num2의 저장위치: %#x \n", ptr2); printf("num3의 저장위치: %#x \n\n", ptr3); printf("포인터 변수 ptr1의 크기: %d \n", sizeof(ptr1)); printf("포인터 변수 ptr2의 크기: %d \n", sizeof(ptr2)); printf("포인터 변수 ptr3의 크기: %d \n\n", sizeof(ptr3)); return 0; } | cs |
1 2 3 4 5 6 7 | num1의 저장위치: 0x62fe4c num2의 저장위치: 0x62fe4b num3의 저장위치: 0x62fe40 num1의 주소 값 크기: 4 num2의 주소 값 크기: 4 num3의 주소 값 크기: 4 | cs |
7~9행에서 포인터 변수 선언과 동시에 초기화 했다.
13~15행에서는 포인터 변수의 크기를 출력했다. 이는 앞서본 예제의 주소값의 크기를 출력한것
과 크기가 동일하다. 이 예제를 통해 int형 포인터이건, char형 포인터이건 모든 포인터는 크기가 동
일하고 포인터는 상수이건 변수이건 항상 크기가 동일하다.
그리고 7~9행을 통해 형성되는 메모리 구조상의 관계를 그림으로 봐보자
위 그림을 보면 1바이트짜리 변수 num2를 참조하는 포인터 변수 ptr2의 크기가 4바이트이다.
사각형의 크기가 바이트 크기를 의미한다. 어차피 첫 번재 바이트의 주소값을 저장하는 것이 포인
터 변수이기 때문에 대상이 1바이트 이건, 4바이트이건 무조건 4바이트로 선언이 되어 메모리 공간
을 참조한다. 그리고 아래 그림을 보면 num1, num2, num3 메모리 공간에 나란히 할당 되었다는 가
정하에 ptr1,2,3가 참조하는 것을 보여준다.
반응형
'BackEnd > C' 카테고리의 다른 글
잘못된 포인터 사용의 예와 NULL 포인터 (0) | 2019.03.12 |
---|---|
포인터 형과 *연산자 (0) | 2019.03.12 |
포인터와 메모리 (0) | 2019.03.11 |
포인터 (0) | 2019.03.11 |
2차원 배열을 함수의 인자로 전달 (0) | 2019.03.11 |