반응형
포인터 (Pointer)
- 메모리 주소를 저장하는 '변수'
> 다른 값이 저장된 공간(변수)를 가리킨다.
- type * 포인터변수명 type 배열변수명[]
> 포인터변수의 type은 가리킬 변수의 type과 일치해야 한다.
>> '주소 값'은 정수이지만, 자료형별로 실제 크기가 다르기 때문
>> '주소 값'의 범위는 4byte --> 포인터변수의 크기는 4byte
- 주소를 다루는 방법 : &연산자 (주소 연산자)
> scanf("%d", &iNum);
> &연산자는 변수의 주소 값을 반환한다. (연산의 결과가 주소 값)
>> 시작 주소를 가르쳐준다. (type의 크기에 맞게 알아서 공간 사용)
- 포인터를 다루는 방법 : *연산자 (간접 참조 연산자)
> int * pNum = NULL; // NULL은 초기화 값
> NULL은 정수 0이다. (포인터인 것을 명시하려고 사용)
> 포인터에서 0은 주소 값이 0이다! 라고 해석하는게 아니라,
가리키는 공간이 없다고 해석
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <stdio.h> void main() { int iNum = 0; int * pNum = NULL; int * pNum2 = &iNum; int * pNum3 = NULL; iNum = 10; // int이기 때문에 iNum 공간에는 정수를 저장할 수 있다. pNum = &iNum; // 포인터변수이기 때문에 pNum 공간에는 주소를 저장 printf("iNum의 값 : %d\n", iNum); printf("iNum의 주소 : %d\n", &iNum); // &연산에 의해 iNum 공간의 주소가 반환 printf("iNum의 주소 : %#p\n", &iNum); // 16진수로 주소 값 출력 printf("pNum의 값 : %d\n", pNum); // pNum은 iNum의 주소값을 저장하고 있다. printf("pNum의 값(주소)을 따라간 공간의 값 : %d\n", *pNum); // (1) pNum : 포인터 변수를 그대로 사용 (내 공간의 값 = 주소 값) // (2) *pNum : 내 공간의 주소를 따라가서 그 공간의 값을 사용 (간접 참조) // --> 정수 값을 저장할 수 있는 공간은 현재 iNum 밖에 없다. // 이 공간을 접근할 수 있는 방법이 늘어났다. (포인터 변수를 통해~~) *pNum = 20; // pNum이 저장하고 있는 주소를 따라간 그 공간의 값을 변경 printf("iNum = %d\n", iNum); printf("*pNum = %d\n", *pNum); // pNum 과 &iNum은 같다. --> iNum 변수의 주소 값 // *pNum 과 iNum은 같다. --> iNum 변수의 값 *pNum3 = iNum; printf("*pNum3 = %d\n", *pNum3); // pNum3 포인터 변수의 값은 NULL (0) 이다. // 간접 참조(*)할 공간이 없다... 그래서 오류! } | cs |
반응형
'C > C언어 이론' 카테고리의 다른 글
| (10)MemoryAllocation (0) | 2018.06.20 |
|---|---|
| (9)struct (0) | 2018.06.20 |
| (7)Array (0) | 2018.06.20 |
| (6)Function (0) | 2018.06.20 |
| (5)Repetitive (0) | 2018.06.20 |