C++ 프로그래밍 09 2009년 2학기 전자정보공학대학 컴퓨터공학부
Outline Review: 포인터 배열과 구조체와 포인터
포인터
포인터 (pointer) 포인터: 변수의 위치(주소)를 나타낸다 메모리: 1번지 메모리: 2번지 메모리: 3번지 메모리: 4번지
메모리와 주소 메모리의 주소 = byte 기준 int a; //4byte 변수의 주소: 메모리 내 시작 주소를 의미 000 변수의 주소: 메모리 내 시작 주소를 의미 int a; //4byte 000 001 002 003 004 005 006
& 연산자 &변수이름 변수의 주소를 반환 int a,b; float c; cout<<“a의 주소: ”<<&a<<“\n”; cout<<“b의 주소: ”<<&b<<“\n”; cout<<“c의 주소: ”<<&c<<“\n”;
포인터 (pointer) = 주소 변수의 주소를 저장하는 변수 포인터의 정의 변수형 * 변수이름;
포인터 예제 int a = 123; int * p; p = &a; cout<<“&a = “<<&a<<“\n”; cout<<“p = “<<p<<“\n”; cout<<“&p = “<<&p<<“\n”;
포인터의 잘못된 할당 포인터는 하나의 타입만 가리킬 수 있다. char c; int * p; 포인터는 하나의 타입만 가리킬 수 있다. char c; int * p; p = &c; // WRONG!!! char * p1; p1 = &c; // correct!
포인터를 이용한 정보 추출/변경 포인터가 가리키는 데이터(변수)로의 접근 *포인터이름 int a = 123; 포인터가 가리키는 데이터(변수)로의 접근 *포인터이름 int a = 123; int * p = &a; cout <<“*p = “<<*p<<“\n”; *p = 789; cout <<“a = “<<a<<“\n”;
Pointer의 초기화: NULL 잘못된 pointer의 사용 예: 실수를 피하는 법: NULL (또는 0) 을 활용 int * p; *p = 123; // WRONG!!! int * p = NULL; if(!p) *p = 123; int * p = 0; if(p!=0) *p = 123; int * p = NULL; if(p!=NULL) *p = 123;
Pointer를 쓰는 좋은 습관 포인터 변수는 정의와 함께 항상 NULL로 초기화 int * p = NULL; if(p!=NULL) *p = 123;
배열과 구조체와 포인터
배열과 포인터 일반적인 변수에서의 포인터와 거의 같다. int arrays[10]; int * p = &arrays[5];
6번째 변수는? pointer p가 array[5]를 가리키고 있을 때: p = &array[6]; p = p + 1;
포인터에 정수를 더하기/빼기 배열을 가리키는 포인터에 정수를 더하는/빼는 것은 원소의 개수만큼 이동하는 것을 의미! -1 +1
포인터간의 뺄셈 주소의 차가 아닌 사이의 원소의 개수가 나온다 int array[10]; int * p1 = array[5]; cout<<“p1=“<<p1<<“\n”; cout<<“p2=“<<p2<<“\n”; cout<<“p2-p1=“<<p2-p1<<“\n”;
포인터로 원소 탐색하기 int array[10]; int * p = array[0]; for(int i=0; i<10; i++) *(p+i) = i; 연습: int i 없이 똑같은 일을 수행하도록 변경 for문을 사용한다. 사용하는 변수는 array와 p 만 사용
배열의 특정 원소를 가리키기 int array[10]; int * p = array[0]; 5번째 원소는? array[5]; 배열의 이름은 첫번째 원소를 가리키는 상수 포인터
포인터의 배열 포인터를 원소로 갖는 배열을 정의할 수 있다 변수형 *포인터이름[원소개수]; 예제) int * pArray[3];
포인터 배열의 사용 예 double a,b,c; a=132; b=124; c=116; double *pArray[3]; pArray[0] = &a; pArray[1] = &b; pArray[2] = &c;
연습 정수 배열 array[10]을 만들고 array[0] = 0, array[1]=1, array[2]=2, …. 가 되도록 for문을 사용하여 값을 채우라 정수 pointer 배열 pArray[10]을 만들고, pArray[0] = &array[9], pArray[1] = &array[8], pArray[2] = &array[7], … 가 되도록 for문을 사용하여 값을 채우라 pArray를 이용하여 array의 내용을 뒤에서 부터 출력
구조체의 배열 구조체를 배열로 쓸 수 있다. struct student { char name[20]; int number; float grade[2]; }; student stdArray[3];
구조체의 배열의 초기화 struct student { char name[20]; int number; float grade[2]; }; student stdArray[3] = {“Kim Chol-Su”,2002132,{3.5,4.3}}, {“Kim Mi-ja”,2002132,{3.5,4.3}}, {“Son o-gong”,2002132,{3.5,4.3}}
구조체를 가리키는 포인터 구조체를 변수형처럼 사용해서 포인터를 정의 할 수 있다 struct rectangle { int x,y; int width, height; }; rectangle rc; rectangle * p = &rc;
구조체의 맴버 변수 접근 구조체변수.맴버변수 구조체에서는: 구조체포인터는: (*구조체포인터).맴버변수 구조체포인터->맴버변수 구조체포인터->맴버변수
구조체의 맴버 변수 접근 예 struct rectangle { int x,y; int width, height; }; rectangle rc; rectangle * p = &rc; rc.x=10; (*p).x = 10; p->x = 10; 모두 같다
구조체와 포인터 구조체 내에 포인터를 맴버로 가질 수 있다 struct IHavePointer { int a; int * p; };
구조체를 가리키는 맴버 포인터 구조체를 가리키는 포인터를 맴버로 가질 수 있다 struct test { int a; test * p; };
구조체를 가리키는 맴버 포인터 struct test { int a; test * p; }; test ts; ts.a=20; ts.p=&ts; cout<<“ts.a:”<<ts.a<<“\n”; cout<<“ts.p->a:”<<ts.p->a<<“\n”; cout<<“ts.p->p->a:”<<ts.p->p->a<<“\n”;
구조체를 가리키는 맴버 포인터 struct Dizzy { int id; Dizzy * p; }; Dizzy a,b,c; a.id = 1; a.p=&b; b.id = 2; b.p=&c; c.id = 3; c.p=&a; cout<<“a.id:”<<a.id<<“\n”; cout<<“b.id:”<<a.p->id<<“\n”; cout<<“c.id:”<<a.p->p->id<<“\n”;
구조체를 가리키는 맴버 포인터
함수1
함수 코드를 정리하고 정돈한다! 사후관리용이
함수란 작은 프로그램 (subprogram)
함수를 쓰는 이유 프로그램 작성 용이 절차의 추상화 일을 여러 단계의 작은 일로 쪼개는 것 Procedural Abstraction 일을 여러 단계의 작은 일로 쪼개는 것 Divide-and-conquer 반복적인 일의 수행 시 소스코드의 크기를 줄여준다
함수의 모양 초등학교 산수시간에… ?
y = f(x) 함수의 모양 고등학교 수학시간에… x: 함수의 인자 (parameter) f(): 함수 본체(body) y: 함수의 결과값 (반환값:return value)
함수의 모양 함수의 정의: 반환변수형 함수이름(인자1, 인자2,…) { 함수 내용; return 반환값; }
함수의 호출 인자(parameter)의 형태 및 개수가 함수의 정의와 같아야 한다. 함수이름(인자1, 인자2,…);
함수의 가장 간단한 모양 함수의 정의-인자와 반환값이 없을 경우: void 함수이름() { 함수 내용; }
간단한 함수 예제 #include <iostream> using namespace std; void printMessage() { cout<<“My first function! \n”; } int main() printMessage(); return 0;
함수의 연습 인자 n을 받아서 “*”을 n개 만큼 출력하는 함수를 만들어라. example) n=5인 경우 ***** 이 함수를 이용하여 다음과 같은 삼각형을 출력! * ** *** **** *****