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