Upload
sloan
View
29
Download
0
Embed Size (px)
DESCRIPTION
포인터의 기초 (-.-). * 목 차. 포인터의 개념 및 정의 포인터의 용도 포인터 사용 주의사항 포인터 사용의 예. * 포인터의 개념. 포인터 변수 다른 객체 ( 변수 ) 의 메모리 주소를 저장하는 변수 - 예 : 변수 q 가 메모리의 100 번지에 위치하고 있다면 포인터 변수 p 는 100 의 값을 갖는다 . 포인터 변수의 선언 형식 : type *var-name; * : 포인터 변수를 생성한다는 것을 표시 예 ) int *p;. - PowerPoint PPT Presentation
Citation preview
포인터의 기초(-.-)
* 목 차
포인터의 개념 및 정의
포인터의 용도
포인터 사용 주의사항
포인터 사용의 예
* 포인터의 개념
포인터 변수
다른 객체 ( 변수 ) 의 메모리 주소를 저장하는
변수 - 예 : 변수 q 가 메모리의 100 번지에 위치하고 있다면
포인터 변수 p 는 100 의 값을 갖는다 .
포인터 변수의 선언 형식 :
type *var-name;
* : 포인터 변수를 생성한다는 것을 표시
예 ) int *p;
* 포인터의 개념 ( 계속 )
포인터 연산자
* : 뒤에 오는 주소 ( 포인터 변수의 내용 ) 에 저장된 값을
반환한다 .
& : 뒤에 오는 변수의 주소를 반환한다 .
< 예 >
int *p, q;
q = 100; /* q 에 100 을 치환한다 . */
p = &q; /* p 에 q 의 주소를 치환한다 . */
printf("%d", *p); /* 포인터를 이용하여 q 의 값을 출력한다 . */
* 포인터의 개념 ( 계속 )
1000 1001 1002 1003 1004 1005
q
p 100q 의 주소를 p 에 치환
p 가 가르키는 것은 q 의 주소이고 , q 의 값이 100, p 가 가르키는 값도 100
q =
100;
p =
&q;
* 포인터의 개념 ( 계속 ) 포인터 연산
< 참고 >*정수만 더하거나 뺄수있음*괄호의 사용 유무에 따라 결과가 달라 진다 .*p++ : p 를 먼저 증가시킨 후 , 새로운 위치에 있는 값을 액세스한다 . (*p)++ : p 가 가리키는 곳의 값을 증가시킨다 .
1000 1001 1002 1003 1004 1005
q
q 의 저장공간
q++ 4 바이트 이동 ..(int)
* 포인터의 개념 ( 계속 )
이중 포인터
int *p, q,
**pp;
q =
100;
p =
&q;
pp =
&p;
1000 1001 1002 1003 1004 1005
qp
q 의 주소를 p 에 치환
pp
p 의 주소를 pp 에 치환
*포인터 사용 주의사항 초기화되지 않는 포인터를 사용하지 말것 < 예 > int *ptr; *ptr = 12; /* 잘못되었음 – ptr 은 어느 것도 가리키고 있지 않다 .
*/ 나누기 , 곱하기 , 퍼센트 등과 같은 수학의 연산을
금할것 변수 유형의 크기를 알아둘 것 배열 변수로 증감연산을 하지말것 < 예 > int ptr[10]; ptr++ /* 잘못 된 사용 */ int *ptrl; ptrl = ptr; *ptrl++;
* 포인터의 용도
참조에 의한 호출 (Call By Reference)
포인터에 의한 호출 (Call By Pointer)
메모리의 동적인 (Dynamic) 활용
* 포인터의 용도 ( 계속 )
Call By Value
void func(int a){
a = 1; // 지역변수 ..}
int main(){
int a = 3;func(a);printf("%d\n",a);
return 0;}
결과 : 3
* 포인터의 용도 ( 계속 )
Call By Pointer
void func(int* a){
*a = 1; }
int main(){
int a = 3;func(&a);printf("%d\n",a);
return 0;}
결과 : 1
* 포인터의 용도 ( 계속 )
Call By Value ( 스왑 )
void interchange(int u, int v); /* 함수 선언 */int main(void){ int x = 5, y = 10;
printf(" 교환 전 x = %d, y = %d\n", x, y); interchange(x, y);printf(" 교환 후 x = %d, y = %d\n", x, y);return 0;
}void interchange(int u, int v) /* 함수 정의 */{ int temp; temp = u;
u = v;v = temp;
}
* 포인터의 용도 ( 계속 )
Call By Reference( 스왑 )
void interchange(int * u, int * v);int main(void){ int x = 5, y = 10; printf(" 교환 전 x = %d, y = %d\n", x, y); interchange(&x, &y); /* 함수에 주소를 전달한다 */ printf(" 교환 후 x = %d, y = %d\n", x, y); return 0;}void interchange(int * u, int * v){ int temp; temp = *u; /* u 가 가리키고 있는 주소의 값을 얻는다 */ *u = *v; *v = temp;}
* 포인터의 용도 ( 계속 )
메모리의 동적인 (Dynamic) 활용
포인터는 시작 주소만 갖기 때문에 포인터 자체는 많은 메모리 공간을 필요로 하지 않는다 .
< 예 >
충북대 학생의 인적 사항을 기록할 때…배열을 사용할 경우 넉넉하게 10000 명정도 잡았다 .
하지만 .. 충북대 학생은 4700 명 밖에 되지 않는다 . 그러면 5300 명의 메모리가 낭비된다 .
포인터를 사용할 경우 .. 처음주소의 메모리만 할당하고 그 뒤에 입력되는 만큼의 양의 메모리만
사용하면 된다 .
* 포인터의 사용 배열과 포인터
#include <stdio.h>
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int main(void) {
int *p;
p = a; /* p 에 a 의 시작 주소를 치환한다 . */
/* 이 문장은 a 의 첫째 , 둘째 , 셋째 원소들을 출력한다 . */
printf("%d %d %d\n", *p, *(p+1), *(p+2));
/* 이 문장은 a 를 사용하여 같은 것을 출력한다 . */
printf("%d %d %d", a[0], a[1], a[2]);
return 0;}
*참고a[] = *a
* 포인터의 사용 문자열 과 포인터
#include <stdio.h>
int main(void)
{
char *p ;
p = "one two three" ; /* 해당 문장열의 테이블 주소를 p 에
치환한다 . */
printf(p) ;
return 0;
}