C언어 - 포인터Pointer
포인터
학습목표
메모리 주소와 주소연산자 &
주소(address)
메모리 공간은 바이트마다 고유한 주소가 존재
메모리 주소는 저장 장소인 변수 이름과 함께 기억 장소를 참조하는 또 다른 방법
주소연산자 &(ampersand)
&가 피연산자인 변수의 메모리 주소를 반환
변수의 주소값은 형식제어문자 %u 또는 %d로 출력
16진수로 출력하려면 형식제어문자 %p를 사용
주소의 출력
address.c
변수의 주소값 출력
포인터 변수 선언
주소 저장 변수
주소연산식 &data는 포인터 변수(pointer variable)에 저장하여 사용 가능
즉 포인터 변수는 주소값을 저장하는 변수
포인터 변수는 변수 선언에서 자료형 뒤에 *(asterisk)를 사용
즉 다음 변수 선언에서 ptrint, ptrshort, ptrchar, ptrdouble은 모두 포인터 변수이며 간단히 포인터라고도 부름
변수 자료형이 따라 그 변수의 주소를 저장하는 포인터의 자료형도 다름
포인터에 주소값 저장
int *ptrint = &data;
“포인터 변수 ptrint는 변수 data 를 가리킨다” 또는 “참조(reference)한다”라고 표현
포인터 변수는 가리키는 변수의 종류에 관계없이 크기가 모두 4바이트
포인터 이용
pointervar.c
포인터 변수 선언과 주소값 대입
포인터 선언과 NULL 포인터
여러 포인터 선언
여러 개의 포인터 변수를 한 번에 선언하기 위해서는 다음과 같이 변수마다 *를 앞에 기술
NULL 저장
특별한 초기값이 없는 경우에 NULL로 초기값을 저장
NULL
헤더 파일 stdio.h에 다음과 같이 정의되어 있는 포인터 상수로서 0번지의 주소값을 의미
(void *)는 아직 결정되지 않은 자료형의 주소
간접 연산자 *
*포인터
포인터 변수가 가리키고 있는 변수를 참조하려면 간접연산자(indirection operator) *를 사용
int *ptrint = &data;
• À§ ¼±¾ðÀ¸•Î Æ÷ÀÎÅÍ ptrint°¡ °¡¸®Å°´Â º¯¼ö°¡ data¶ó¸é *ptrintÀº º¯¼ö data¸¦ ÀǹÌ
간접 참조의 이용
dereference.c
포인터 변수와 간접연산자 *를 이용한 간접 참조
포인터 변수의 연산
주소 연산
포인터 변수는 간단한 더하기와 뺄셈 연산으로 주소를 수정
포인터의 연산은 절대적인 주소의 계산이 아니며, 포인터가 가리키는 변수 크기에 비례한 연산
포인터 연산의 이용
pointerarith.c
포인터 변수의 간단한 덧셈 뺄셈 연산
double형 포인터에 100이라는 주소값을 저장하려면 포인터 자료형으로 100을 변환하는 연산식 (double *) 100을 사용해 저장
포인터 변수의 이동
배열 원소의 참조
포인터 pa에 &a[0]를 저장하면 연산식 *(pa+i)으로 배열 원소를 참조
특히 포인터 pa로도 배열과 같이 첨자를 이용하여 pa[i]로 배열 원소를 참조
참조연산자의 다양한 연산
pointerpriority.c
간접연산자와 증감연산자의 이용
참조연산자 *의 우선순위는 ++p의 전위 증감연산자와 같고, 괄호나 p++의 후위 증감연산자보다 낮음
그러므로 연산식 *p++는 *(p++)를 의미
• *p++´Â Æ÷ÀÎÅÍ p°¡ °¡¸®Å°´Â º¯¼ö¸¦ ÂüÁ¶ÇÏ°í pÀÇ ÁÖ¼Ò¸¦ 1 Áõ°¡
• ¹Ý¸é (*p)++´Â Æ÷ÀÎÅÍ p°¡ °¡¸®Å°´Â º¯¼ö¸¦ ÂüÁ¶ÇÏ°í ±× °ªÀ» 1 Áõ°¡½ÃÅ°´Â ¿¬»ê½Ä
포인터 변수의 형변환
명시적 형변환
포인터 변수는 동일한 자료형끼리만 대입이 가능
만일 대입문에서 포인터의 자료형이 다르면 경고가 발생
포인터 변수는 자동으로 형변환(type cast)이 불가능하며 필요하면 명시적으로 형변환을 수행 가능
*pi로 수행하는 간접 참조는 pi가 가리키는 주소에서부터 4바이트 크기의 int형 자료를 참조한다는 것을 의미
다중 포인터
이중 포인터
포인터 변수의 주소값을 갖는 변수
다시 이중 포인터의 주소값을 갖는 변수는 삼중 포인터
이러한 포인터의 포인터를 모두 다중 포인터
변수 선언에서 *를 여러 번 이용하여 다중 포인터 변수를 선언
이중 포인터의 이용
multipointer.c
이중 포인터를 이용한 변수의 참조
포인터 배열
여러 포인터 모임
주소값을 저장하는 포인터를 배열 원소로 하는 배열
일반 배열 선언에서 변수 이름 앞에 *를 붙이면 포인터 배열 변수 선언
포인터 배열 선언 시 초기값을 지정
문장 double *dary[5] = {NULL};
포인터 배열 메모리 구조
포인터 배열 pary
int형 포인터 3개를 원소로 갖는 배열
포인터 배열 이용
pointerarray.c
포인터 배열 pary의 이용해 표준입력을 받아 다시 원래 변수 a, b, c로 출력
배열 포인터
배열 주소를 저장
int 형인 일차원 배열 int a[]의 주소는 (int *)인 포인터 변수에 저장
열이 4인 이차원 배열 ary[][4]의 주소를 저장하려면
• Æ÷ÀÎÅÍ º¯¼ö ptrÀ» ¹®Àå int (*ptr)[4];•Î ¼±¾ð
배열 포인터와 포인터 배열
배열 포인터
int (*ptr)[4];
• ¿ÀÌ 4ÀÎ ÀÌÂ÷¿ø ¹è¿ Æ÷ÀÎÅÍ ¼±¾ð ¹®Àå
• °ýÈ£ (*ptr)Àº ¹Ýµå½Ã ÇÊ¿ä
포인터 배열
int *ptr[4];
배열 포인터 이용
tdarypointer.c
배열 이름 a는 포인터 상수
변수 p는 포인터 변수
배열 첫 원소를 참조하려면
• **ptrÀ» ÀÌ¿ë
연산식 **ptr++
• ¿¬»ê ¿ì¼±¼øÀ§¿¡ µû¶ó **(ptr++)¿Í °°À¸¸ç
• ÇöÀç Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â ¿ø¼Ò¸¦ ÂüÁ¶ÇÏ°í ´ÙÀ½ ¿ø¼Ò•Î À̵¿ÇÏ´Â ¿¬»ê½Ä
일차원 배열과 포인터
배열 이름을 이용한 참조
배열 score에서 배열 이름 score 자체가 배열 첫 원소의 주소값
일차원 배열과 포인터
일차원 배열에서 배열 원소와 주소값을 참조
이차원 배열과 포인터
배열 이름과 행 이름으로 참조
이차원 배열과 포인터
연산식 (*td+n)
배열의 (n+1)번째 원소의 주소값
역참조연산자를 이용한 연산식 *(*td+n)은 배열의 (n+1)번째 원소 자체
다양한 배열 원소의 참조 방법
포인터 상수: point
포인터 변수: address
함수에서의 배열 전달
함수 형식매개변수에서 배열 사용
함수 포인터
함수 주소 저장 변수
함수의 주소값을 저장하는 포인터 변수
함수 포인터를 이용한 함수 호출
일반 함수 호출과 동일
함수 포인터 이용
functionpointer.c
함수 주소를 저장하는 함수 포인터의 선언과 사용
함수 포인터 배열
함수 포인터를 위한 배열 선언과 사용
'myPPT' 카테고리의 다른 글
마하트마 간디(Mohandas Karamchand Gandhi) (0) | 2016.01.15 |
---|---|
사회 : 인국분포 (0) | 2016.01.12 |
3D 입체영상 기술 (0) | 2015.12.29 |
R 언어로 그래프 그리기 (0) | 2015.12.26 |
Digital Convergence(디지털 컨버전스) (0) | 2015.12.22 |