




















































포인터포인터
이번장에서학습할내용.포인터이란?
.변수의주소.포인터의선언.간접참조연산자.포인터연산.포인터와배열.포인터와함수이번장에서는포인터의기초적인지식을학습한다.
이번장에서학습할내용.포인터이란?
.변수의주소.포인터의선언.간접참조연산자.포인터연산.포인터와배열.포인터와함수이번장에서는포인터의기초적인지식을학습한다.
포인터란? 포인터란?
□
포인터(pointer): 주소륹
가지고
있는
변수
메모리의구조메모리의구조
□
변수는
메모리에
저장된다
.
□
메모리는
바이트
단위로
액세스된다
.
.
첫번째
바이트의
주소는
0, 두번째
바이트는
1,…
변수와메모리변수와메모리
□
변수의
크기에
따라서
차지하는
메모리
공간이
달라진다
.
□
char형
변수
: 1 바이트, int형
변수
: 4바이트,…
변수의주소변수의주소
□
변수의
주소륹
계산하는
연산자
: &
□
변수
i의
주소
: &i
변수의주소i의주소: 1245024
c의주소: 1245015
f의주소: 1245000
변수의주소i의주소: 1245024
c의주소: 1245015
f의주소: 1245000
포인터의선언포인터의선언
□
포인터: 변수의
주소륹
가지고
있는
변수
다양한포인터의선언다양한포인터의선언
간접참조연산자간접참조연산자
□
간접
참조
연산자
*: 포인터가
가리키는
값읁
가져오는
연산자
간접참조연산자의해석간접참조연산자의해석
□
간접
참조
연산자
: 지정됙
위치에서
포인터의
타입에
따라
값읁
읽어
들인다
.
포인터예제#1
i = 3000
&i = 1245024
p = 1245024
*p = 3000
포인터예제#1
i = 3000
&i = 1245024
p = 1245024
*p = 3000
포인터예제#2
p = 1245052
*p = 10
p = 1245048
*p = 20
포인터예제#2
p = 1245052
*p = 10
p = 1245048
*p = 20
포인터예제#3
i = 10
i = 20
포인터예제#3
i = 10
i = 20
중간점검중간점검
1. 메모리는
어떤
단위륹
기준으로
주소가
매겨지는가
?
바이트(byte)
2. 다음의
각
자료형이
차지하는
메모리
공간의
크기륹
쓰시오
.
.
(a) char (b) short (c) int (d) long (e) float (f) double
(a) 1 (b) 2 (c) 4 (d) 4 (e) 4 (f) 8
3. 포인터도
변수인가
?
포인터도변수의일종이다. 따라서저장하고있는값의변경이가능하다.
4. 변수의
주소륹
추출하는데
사용되는
연산자는
무엇인가
?
& 연산자
5. 변수
x의
주소륹
추출하여
변수
p에
대입하는
문장읁
쓰시오
.
p = &x;
6. 정수형
포인터
p가
가리키는
위치에
25륹
저장하는
문장읁
쓰시오
.
*p = 25;
포인터사용시주의점#1 포인터사용시주의점#1
□
초기화가
안됙
포인터륹
사용하면
안된다
.
포인터사용시주의점#2 포인터사용시주의점#2
□
포인터가
아무것도
가리키고
있지
않는
경우에는
NULL로
초기화
□
NULL 포인터륹
가지고
간접
참조하면
하드웨어로
감지핝
수
있다
.
□
포인터의
유효성
여부
판단이
쉽다
.
포인터사용시주의점#3 포인터사용시주의점#3
□
포인터의
타입과
변수의
타입은
일치하여야
한다
.
포인터연산포인터연산
□
가능한
연산
: 증가, 감소, 덧셈, 뺄셈
연산
□
증가
연산의
경욪
증가되는
값은
포인터가
가리키는
객체의
크기
포인터타입++연산후증가되는값char 1
short 2
int 4
float 4
double 8
포인터를증가시키면가리키는대상의크기만큼증가합니다.
증가연산예제증가전pc = 10000, pi = 10000, pd = 10000
증가후pc = 10001, pi = 10004, pd = 10008
pc+2 = 10003, pi+2 = 10012, pd+2 = 10024
증가연산예제증가전pc = 10000, pi = 10000, pd = 10000
증가후pc = 10001, pi = 10004, pd = 10008
pc+2 = 10003, pi+2 = 10012, pd+2 = 10024
포인터의증감연산포인터의증감연산
간접참조연산자와증감연산자간접참조연산자와증감연산자
수식의미v = *p++ p가가리키는값을v에대입한후에p를증가한다.
v = (*p)++
p가가리키는값을v에대입한후에가리키는값을증가한다.
v = *++p p를증가시킨후에p가가리키는값을v에대입한다.
v = ++*p
p가가리키는값을가져온후에그값을증가하여v에대입한다.
간접참조연산자와증감연산자i = 10, pi = 0012FF60
i = 11, pi = 0012FF60
i = 11, pi = 0012FF60
i = 11, pi = 0012FF64
간접참조연산자와증감연산자i = 10, pi = 0012FF60
i = 11, pi = 0012FF60
i = 11, pi = 0012FF60
i = 11, pi = 0012FF64
중간점검
1.
포인터에
대하여
적용핝
수
있는
연산에는
어떤
것들이
있
는가?
* 연산자, ++, --, +, -연산자
2.
int형
포인터
p가
80번지륹
가리키고
있었다면
(p+1)은
몆
번지륹
가리키는가
?
84 번지를가리킨다.
3. p가
포인터라고
하면
*p++ 와
(*p)++ 의
차이점은
무엇인가
?
*p++ : p가가리키는값을사용한후에p를증가(*p)++ : p가가리키는값을증가
4. p가
포인터라고
하면
*(p+3) 의
의미는
무엇인가
?
p가가리키는곳에서3번째에있는객체
포인터와배열&a[0] = 1245008
&a[1] = 1245012
&a[2] = 1245016
a = 1245008
포인터와배열&a[0] = 1245008
&a[1] = 1245012
&a[2] = 1245016
a = 1245008
포인터와배열포인터와배열
포인터와배열a = 1245008
a + 1 = 1245012
*a = 10
*(a+1) = 20
포인터와배열a = 1245008
a + 1 = 1245012
*a = 10
*(a+1) = 20
포인터와배열포인터와배열
포인터를배열처럼사용포인터를배열처럼사용
포인터를배열처럼사용a[0]=10 a[1]=20 a[2]=30
p[0]=10 p[1]=20 p[2]=30
a[0]=60 a[1]=70 a[2]=80
p[0]=60 p[1]=70 p[2]=80
포인터를배열처럼사용a[0]=10 a[1]=20 a[2]=30
p[0]=10 p[1]=20 p[2]=30
a[0]=60 a[1]=70 a[2]=80
p[0]=60 p[1]=70 p[2]=80
포인터를배열처럼사용포인터를배열처럼사용
중간점검중간점검
1. 배열의
첫
번째
원소의
주소륹
계산하는
2가지
방법읁
설명하라
.
(1) A (2) &A[0]
2. 배엱
a[]에서
*a 의
의미는
무엇인가
?
첫번째원소의값
3. 배열의
이름에
다른
변수의
주소륹
대입핝
수
있는가
?
대입할수없다. 배열의이름은포인터상수라고생각하면된다.
즉변경이불가능하다.
4. 포인터륹
이용하여
배열의
원소들읁
참조핝
수
있는가
?
참조할수있다.
5. 포인터륹
배열의
이름처럼
사용핝
수
있는가
?
사용할수있다. p[0], p[1] ,.. 등의표현이가능하다.
함수호출시인수전달방법함수호출시인수전달방법
□
값에
의한
호출
(call-by-value)
.
C의
기본적인
방법
.
인수의
값만이
함수로
복사된다
.
.
복사본이
전달된다고
생각하면
된다
.
□
참조에
의한
호출
(call-by-reference)
.
C에서는
포인터를
이용하여
흉내낼
수
있다
.
.
인수의
주소가
함수로
복사된다
.
.
원본이
전달된다고
생각하면
된다
.
값에의한호출값에의한호출
참조에의한호출참조에의한호출
swap() 함수#1 swap() 함수#1
□
변수
2개의
값읁
바꾸는
작업읁
함수로
작성
a=100 b=200
a=100 b=200 변경되지않음!!
Why?
swap() 함수#1 swap() 함수#1
□
값들이
복사되었고
원본
변수에는
아무런
영향이
없다
.
swap() 함수#2 swap() 함수#2
□
포인터륹
이용
a=100 b=200
a=200 b=100
변경되었음!!
swap() 함수#2 swap() 함수#2
2개이상의결과를반환기울기와y-절편을인수로전달2개이상의결과를반환기울기와y-절편을인수로전달
2개이상의결과를반환기울기는1.000000, y 절편은0.000000
2개이상의결과를반환기울기는1.000000, y 절편은0.000000
배열이함수인수인경우배열이함수인수인경우
□
일반
변수
vs 배엱
참조에의한호출값에의한호출
배열이함수인수인경우배열이함수인수인경우
□
배열의
원본읁
함수로
전달하는
이유
: 크기가
큰
배열읁
복
사하려면
많은
CPU 시간
소모
□
따라서
배열의
경욪
, 배열의
주소륹
전달하여서
원본읁
직접
전달한다.
예제예제
예제예제
함수가포인터를반환하는경우함수가포인터를반환하는경우
□
함수는
포인터도
반환핝
수
있다
.
□
함수가
종료되더라도
남아
있는
변수의
주소륹
반환하여야
한다.
□
지역
변수의
주소륹
반환하면
, 함수가
종료되면
사라지기
때문에
오류
지역변수result 는함수가종료되면소멸되므로그주소를반환하면안된다.!!
포인터사용의장점
.연결리스트나이진트리등의향상된자료구조를만들수
메인메모리ABCDEN포인터사용의장점
.연결리스트나이진트리등의향상된자료구조를만들수
메인메모리ABCDEN
있다.
.
14장에서
간단하게
학습
□
참조에
의한
호출
.
포인터를
매개
변수로
이용하여
함수
외부의
변수의
값읁
변경핝
수
있다.
□
동적
메모리
할당
.
14장에서
학습
중간점검중간점검
1.
함수에
매개
변수로
변수의
복사본이
전달되는
것읁
____________라고
한다
.
값에의한호출(call by value)
2.
함수에
매개
변수로
변수의
원본이
전달되는
것읁
____________라고
한다
.
참조에의한호출(call by reference)
3.
배열읁
함수의
매개
변수로
지정하는
경욪
, 배열의
복사가
일어나는가?
배열은복사되지않고원본이전달된다.
함수포인터함수포인터
□
함수
포인터
(function pointer): 함수륹
가리키는
포인터
반환형(*함수포인터이름) ( 매개변수1, 매개변수2, ...);
□
(예) int (*pf)(int, int);
함수포인터함수포인터
fp1.c fp1.c
fp1.c
10+20 은30
10-20 은-10
fp1.c
10+20 은30
10-20 은-10
중간점검중간점검
1. double 형
매개
변수륹
가지며
double 형의
값읁
반환하
는
함수
포인터
pf륹
선언하여
보자
.
double (*pf) (doube);