160 likes | 253 Views
포인터의 기초 (-.-). * 목 차. 포인터의 개념 및 정의 포인터의 용도 포인터 사용 주의사항 포인터 사용의 예. * 포인터의 개념. 포인터 변수 다른 객체 ( 변수 ) 의 메모리 주소를 저장하는 변수 - 예 : 변수 q 가 메모리의 100 번지에 위치하고 있다면 포인터 변수 p 는 100 의 값을 갖는다 . 포인터 변수의 선언 형식 : type *var-name; * : 포인터 변수를 생성한다는 것을 표시 예 ) int *p;.
E N D
* 목 차 • 포인터의 개념 및 정의 • 포인터의 용도 • 포인터 사용 주의사항 • 포인터 사용의 예
* 포인터의 개념 • 포인터 변수 다른 객체(변수)의 메모리 주소를 저장하는 변수 - 예: 변수 q가 메모리의 100 번지에 위치하고 있다면 포인터 변수 p는 100의 값을 갖는다. • 포인터 변수의 선언 형식: type *var-name; * : 포인터 변수를 생성한다는 것을 표시 예) int *p;
* 포인터의 개념(계속) • 포인터 연산자 * : 뒤에 오는 주소(포인터 변수의 내용)에 저장된 값을 반환한다. & : 뒤에 오는 변수의 주소를 반환한다. <예> int *p, q; q = 100; /* q에 100을 치환한다. */ p = &q; /* p에 q의 주소를 치환한다. */ printf("%d", *p); /* 포인터를 이용하여 q의 값을 출력한다. */
* 포인터의 개념(계속) q = 100; p = &q; q p 100 q의 주소를 p에 치환 p가가르키는 것은 q의 주소이고,q의 값이 100, p가 가르키는 값도 100
* 포인터의 개념(계속) • 포인터 연산 <참고> *정수만 더하거나 뺄수있음 *괄호의 사용 유무에 따라 결과가 달라 진다. *p++ : p를 먼저 증가시킨 후, 새로운 위치에 있는 값을 액세스한다. (*p)++ : p가 가리키는 곳의 값을 증가시킨다. q q의 저장공간 q++ 4바이트 이동..(int)
* 포인터의 개념(계속) • 이중 포인터 int *p, q, **pp; q = 100; p = &q; pp = &p; pp p q p의 주소를 pp에 치환 q의 주소를 p에 치환
*포인터 사용 주의사항 • 초기화되지 않는 포인터를 사용하지 말것 <예> 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명의 메모리가 낭비된다. 포인터를 사용할 경우.. 처음주소의 메모리만 할당하고 그 뒤에 입력되는 만큼의 양의 메모리만 사용하면 된다.
* 포인터의 사용 *참고 a[] = *a • 배열과 포인터 #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;}
* 포인터의 사용 • 문자열 과 포인터 #include <stdio.h> int main(void) { char *p ; p = "one two three" ; /* 해당 문장열의 테이블 주소를 p에 치환한다. */ printf(p) ; return 0; }