16
포포포포 포포 (-.-)

포인터의 기초 (-.-)

  • Upload
    sloan

  • View
    29

  • Download
    0

Embed Size (px)

DESCRIPTION

포인터의 기초 (-.-). * 목 차. 포인터의 개념 및 정의 포인터의 용도 포인터 사용 주의사항 포인터 사용의 예. * 포인터의 개념. 포인터 변수 다른 객체 ( 변수 ) 의 메모리 주소를 저장하는 변수 - 예 : 변수 q 가 메모리의 100 번지에 위치하고 있다면 포인터 변수 p 는 100 의 값을 갖는다 . 포인터 변수의 선언 형식 : type *var-name; * : 포인터 변수를 생성한다는 것을 표시 예 ) int *p;. - PowerPoint PPT Presentation

Citation preview

Page 1: 포인터의 기초 (-.-)

포인터의 기초(-.-)

Page 2: 포인터의 기초 (-.-)

* 목 차

포인터의 개념 및 정의

포인터의 용도

포인터 사용 주의사항

포인터 사용의 예

Page 3: 포인터의 기초 (-.-)

* 포인터의 개념

포인터 변수

다른 객체 ( 변수 ) 의 메모리 주소를 저장하는

변수 - 예 : 변수 q 가 메모리의 100 번지에 위치하고 있다면

포인터 변수 p 는 100 의 값을 갖는다 .

포인터 변수의 선언 형식 :

type *var-name;

* : 포인터 변수를 생성한다는 것을 표시

예 ) int *p;

Page 4: 포인터의 기초 (-.-)

* 포인터의 개념 ( 계속 )

포인터 연산자

* : 뒤에 오는 주소 ( 포인터 변수의 내용 ) 에 저장된 값을

반환한다 .

& : 뒤에 오는 변수의 주소를 반환한다 .

< 예 >

int *p, q;

q = 100; /* q 에 100 을 치환한다 . */

p = &q; /* p 에 q 의 주소를 치환한다 . */

printf("%d", *p); /* 포인터를 이용하여 q 의 값을 출력한다 . */

Page 5: 포인터의 기초 (-.-)

* 포인터의 개념 ( 계속 )

1000 1001 1002 1003 1004 1005

q

p 100q 의 주소를 p 에 치환

p 가 가르키는 것은 q 의 주소이고 , q 의 값이 100, p 가 가르키는 값도 100

q =

100;

p =

&q;

Page 6: 포인터의 기초 (-.-)

* 포인터의 개념 ( 계속 ) 포인터 연산

< 참고 >*정수만 더하거나 뺄수있음*괄호의 사용 유무에 따라 결과가 달라 진다 .*p++ : p 를 먼저 증가시킨 후 , 새로운 위치에 있는 값을 액세스한다 . (*p)++ : p 가 가리키는 곳의 값을 증가시킨다 .

1000 1001 1002 1003 1004 1005

q

q 의 저장공간

q++ 4 바이트 이동 ..(int)

Page 7: 포인터의 기초 (-.-)

* 포인터의 개념 ( 계속 )

이중 포인터

int *p, q,

**pp;

q =

100;

p =

&q;

pp =

&p;

1000 1001 1002 1003 1004 1005

qp

q 의 주소를 p 에 치환

pp

p 의 주소를 pp 에 치환

Page 8: 포인터의 기초 (-.-)

*포인터 사용 주의사항 초기화되지 않는 포인터를 사용하지 말것 < 예 > int *ptr; *ptr = 12; /* 잘못되었음 – ptr 은 어느 것도 가리키고 있지 않다 .

*/ 나누기 , 곱하기 , 퍼센트 등과 같은 수학의 연산을

금할것 변수 유형의 크기를 알아둘 것 배열 변수로 증감연산을 하지말것 < 예 > int ptr[10]; ptr++ /* 잘못 된 사용 */ int *ptrl; ptrl = ptr; *ptrl++;

Page 9: 포인터의 기초 (-.-)

* 포인터의 용도

참조에 의한 호출 (Call By Reference)

포인터에 의한 호출 (Call By Pointer)

메모리의 동적인 (Dynamic) 활용

Page 10: 포인터의 기초 (-.-)

* 포인터의 용도 ( 계속 )

Call By Value

void func(int a){

a = 1; // 지역변수 ..}

int main(){

int a = 3;func(a);printf("%d\n",a);

return 0;}

결과 : 3

Page 11: 포인터의 기초 (-.-)

* 포인터의 용도 ( 계속 )

Call By Pointer

void func(int* a){

*a = 1; }

int main(){

int a = 3;func(&a);printf("%d\n",a);

return 0;}

결과 : 1

Page 12: 포인터의 기초 (-.-)

* 포인터의 용도 ( 계속 )

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;

}

Page 13: 포인터의 기초 (-.-)

* 포인터의 용도 ( 계속 )

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;}

Page 14: 포인터의 기초 (-.-)

* 포인터의 용도 ( 계속 )

메모리의 동적인 (Dynamic) 활용

포인터는 시작 주소만 갖기 때문에 포인터 자체는 많은 메모리 공간을 필요로 하지 않는다 .

< 예 >

충북대 학생의 인적 사항을 기록할 때…배열을 사용할 경우 넉넉하게 10000 명정도 잡았다 .

하지만 .. 충북대 학생은 4700 명 밖에 되지 않는다 . 그러면 5300 명의 메모리가 낭비된다 .

포인터를 사용할 경우 .. 처음주소의 메모리만 할당하고 그 뒤에 입력되는 만큼의 양의 메모리만

사용하면 된다 .

Page 15: 포인터의 기초 (-.-)

* 포인터의 사용 배열과 포인터

#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

Page 16: 포인터의 기초 (-.-)

* 포인터의 사용 문자열 과 포인터

#include <stdio.h>

int main(void)

{

char *p ;

p = "one two three" ; /* 해당 문장열의 테이블 주소를 p 에

치환한다 . */

printf(p) ;

return 0;

}