제 8 장 포인터
목 차 메모리와 포인터 포인터의 종류 포인터와 배열 포인터의 포인터 함수와 포인터
메모리와 포인터(1) 변수와 주소 포인터란 ? 포인터의 사용 변수 또는 기억장치 위치의 주소를 표현하는 수식 자료형에 의하여 직접 제어 빠른 엑세스 속도 재귀적 지정이 가능 포인터의 사용 호출 프로그램 내에서 변수 변경할 수 있는 함수 구축 시 배열 처리 함수내의 메모리를 동적으로 배열할 경우 연결 리스트와 같은 자료 표현을 구축할 경우
메모리와 포인터(2) 변수와 주소(계속) 메모리상의 주소와 변수의 관계
메모리와 포인터(3) 변수와 주소(계속) 형식 예 자료형 *포인터변수명; 포인터변수명 = &일반변수명; *포인터변수명 = 일반변수명 ; 예 nt num, *p_num; //p_num은 주소 저장 포인터형 변수 p_num = # //p_num에 num의 주소값 할당 *p_num = num; //p_num의 주소에 num값 할당
메모리와 포인터(4) 포인터 연산 할당연산, 사칙연산, 증감연산 할당 연산 포인터에 배열 데이터를 할당 “&” 연산자를 사용 int *p, d; p = &d; 포인터에 배열 데이터를 할당 변수명을 사용 포인터는 그 배열의 첫 메모리 번지를 지정 int *p, d[4]; p = d; 포인터 위치의 자료 값을 얻고자 할 경우 * 연산자를 사용 d = *p;
메모리와 포인터(5) 포인터 연산(계속) 사칙연산 해당 데이터를 포인터형 만큼 이동하는 데에 사용 예 char형은 1바이트, int형은 2(4)바이트 포인터 안의 자료 값을 사칙연산 (*변수) 형태 (*p)+20; (*p)가 가리키는 자료의 값에 20을 더함
메모리와 포인터(6) 포인터 연산(계속) 증감연산 sizeof() 연산자 “++”, “--” 이용 p++ *p++ (*p)++ 메모리의 위치가 해당 포인터형 만큼 증가 *p++ p++가 먼저 이루어지고 다음에 *기호가 붙는 형태 p의 메모리 번지가 먼저 증가 그 증가된 메모리의 번지 내의 데이터 값 (*p)++ 해당 데이터가 증가 sizeof() 연산자
포인터의 종류(1) char 포인터 문자 혹은 문자의 주소를 가리키는 것 주로 문자열을 컨트롤할 경우 많이 사용 문자열인 경우 할당할 자료보다 크기가 1이 크게 형식 char *포인터변수명; //선언 포인터변수명 = 배열명; //배열을 포인터로 받기 예 char *p; char univ[5]={"HKNU"}; //끝에 Null 문자 자동 삽입 p = univ;
포인터의 종류(2) char 포인터(계속) 메모리상의 문자열 할당 예
포인터의 종류(3) char 포인터(계속) 문자열의 배열과 포인터 변수의 차이 문자열의 배열 포인터 변수 선언방법 문자열의 배열 포인터 변수 선언방법 char str[]; char *str 초 기 화 static char str []="Lee"; char *str = "Lee"; 자료길이 고정 가변 요소참조 str[i] (i=0, 1, 2, 3…) *(str +i) (i=0, 1, 2, …) 값 할당 str[0]='C';… str= "POINTER" 시작번지 str 번지연산 불가능 가능 (예: str++) 속 도 포인터 변수보다 느리다 상대적으로 빠르다
포인터의 종류(4) int 포인터 2(4)바이트에 1개의 int형 자료가 할당 2(4)바이트 크기로 주소값이 증가 형식 예 포인터변수명 = 배열명; //배열을 포인터로 받기 예 int *p, univ[2]={99, 100}; p = univ;
포인터의 종류(5) int 포인터 int 포인터의 메모리 할당
포인터의 종류(6) float 포인터 4(8)바이트에 1개의 float형 자료가 할당 4(8)바이트 크기로 주소값이 증가 형식 포인터변수명 = 배열명; //배열을 포인터로 받기 예 float *p; float pi[2]={3.14, 3.1415}; p = pi;
포인터의 종류(7) float 포인터(계속) float 포인터의 메모리 할당
포인터와 배열(1) 포인터와 배열은 메모리에 직접 접근 포인터 이용이 배열보다 고속 함수 인자용 배열 처리 위해 포인터가 필요 배열은 메모리 배열 영역에 영역을 고정 확보 포인터 변수는 변수의 영역에 유동적 확보 포인터 변수는 값이 결정될 때 메모리 확보
포인터와 배열(2) 포인터 배열 포인터도 일종의 자료형이므로 배열 처리 가능 포인터 자체가 배열로 존재 배열 요소 액세스 시 첨자 계산 않고 간접 액세스 배열 내 형의 크기를 다르게 사용 가능 단점 포인터를 기억할 장소 추가 필요 각 포인터의 초기치를 설정하는 단계가 필요
포인터와 배열(3) 포인터 배열(계속) 예 int *p[5], data[5][10]; p[0] = data[0], p[1] = data[1];
포인터와 배열(4) 상수 포인터 배열 문자형 상수, 숫자형 상수 포인터 배열로 구분 문자열 상수 포인터 배열은 문자형의 포인터 배열 변수를 선언 후 초기치를 할당 예 static char *week[] = {"sun", "mon", "tue", "wed", "thu", "fri", "sat"}; 숫자형 상수 포인터 전체 블록 { }으로 표시 후 해당 배열만큼 숫자값을 할당 실제 한 개가 2(4)byte의 1차원 배열의 형태 각 포인터가 한 개의 값 소유
포인터와 배열(5) 동적 메모리 포인터 모리를 동적으로 할당 해당 메모리를 포인터 배열 이용 지정 malloc() 함수를 사용 int형으로 선언된 배열의 크기를 먼저 입력 반복문 이용 malloc()함수에 의해 메모리를 할당 빈 메모리 공간에 각각 데이터를 입력 free() 함수를 이용 반드시 메모리 해제
포인터와 배열(6) 다중 포인터 배열 포인터 배열을 2차원 이상으로 확장 한 것 형식 예 자료형 *포인터변수명[첨자][첨자]; char *char_p[5][5] 1111
포인터의 포인터(1) 포인터의 포인터 이중 포인터 형식 예 포인터 자료를 가리키는 포인터 자료형 **포인터변수명; char data[], *p[], **double_p; p=data; double_p = p;
포인터의 포인터(2) 포인터의 포인터(계속) 실 예 int data, *p, **pp; data=100; p=&data;
포인터의 포인터(3) 다중 포인터 포인터가 2개 이상인 경우 실제로 다중 포인터를 많이 사용하지 않음 3D 자료의 처리가 많은 분야의 자료 처리용 예 char buff[256], ***student_p; student_p=(char ***)malloc(sizeof(char **)*num); student_p[i]=(char **)malloc(sizeof(char *)*3); student_p[i][0]=(char *)malloc(len); strcpy(student_p[i][0],buff);
포인터의 포인터(4) 동적 포인터의 포인터 포인터의 포인터에 포인터 자료를 저장할 메모리를 할당하고, 이 각각의 포인터에 포인터를 설정하는 것 예 char **p; p=(char **)malloc((char *)*3); for(i=0;i<3;i++) p[i]=(char *)malloc(8); .... for(i=0;i<3;i++) free(p[i]); free(p);
함수와 포인터(1) 함수에 함수를 매개변수로 전달 할 때 사용 형식 예 호출쪽 : 자료형 *함수명 호출쪽 : 자료형 *함수명 함수쪽 : 자료형 *함수명(형식매개변수 list) 예
함수와 포인터(2) 함수 포인터의 사용 우선순위 1. int *func(); 2. int (*func)(); int형 포인터를 되돌려주는 함수로서 int *(func())와 같다. 2. int (*func)(); func는 int형을 되돌려주는 함수에 대한 포인터이다. 3. int(*func [])(); func는 int형을 되돌려주는 함수에 대한 포인터들로 된 배열이며 int *func[](0와 같다.