14 . 포인터

74
14. 포포포 Name Title Company Name

Upload: juro

Post on 17-Jan-2016

80 views

Category:

Documents


0 download

DESCRIPTION

14 . 포인터. Name Title Company Name. 학습할 내용. 데이터와 메모리 주소 메모리 주소를 저장하는 포인터 변수 포인터와 배열 포인터에 대한 연산 포인터와 문자열 함수와 포인터 문자열처리와 관련된 라이브러리 함수 키워드 const. 포인터란 ?. 포인터 (pointer) 는 에스파냐 원산의 꿩 사냥개 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 14 .   포인터

14. 포인터

NameTitleCompany Name

Page 2: 14 .   포인터

학습할 내용

데이터와 메모리 주소

메모리 주소를 저장하는 포인터 변수

포인터와 배열

포인터에 대한 연산

포인터와 문자열

함수와 포인터

문자열처리와 관련된 라이브러리 함수

키워드 const

Page 3: 14 .   포인터

포인터란 ?포인터 (pointer) 는 에스파냐 원산의 꿩 사냥개이 사냥개는 후각이 예민하여 사냥감을 발견하면 오른쪽 앞발을 쳐들어 올리고 주시 ( 注視 ) 하는 특성이 있다고 합니다 . 이러한 현상을 포인트 (point) 라고 하며 , 품종의 이름은 이러한 특성으로 유래되었다고 한다 .이 개의 특징은 사냥감을 직접 잡는 것이 아니라 포수에게 사냥감의 정확한 위치만을 알려줌으로써 사냥을 쉽게 할 수 있도록 도와주는 역할을 한다 .

Page 4: 14 .   포인터

포인터란 ?레이저 포인터 (laser pointer)레이저 포인터라는 장비의 역할은 설명하려는 부분을 가리키는 것이다 .

C 언어에서의 포인터라는 개념도 이와 동일하다 . C 언어에서의 포인터 역시 무엇인가를 가리키는데 그 대상은 컴퓨터 메모리의 주소이다 .

Page 5: 14 .   포인터

데이터와 메모리 주소 메모리 (memory) : 데이터를 보관하는 장치 ( 주 기억장치 , 메인 메모리 )데이터를 효율적으로 보관하기 위해 저장 위치를 나타내는 일련번호가 붙는데 이를 메모리 주소 (address) 라 한다 . 이 주소는 호텔의 객실을 관리하기 위해 붙인 객실 번호 또는 아파트 단지 내에서 동과 호수로 표현하는 주소와 같은 개념이다 .

Page 6: 14 .   포인터

메모리 주소와 포인터 포인터 (pointer) 는 메모리상의 어떤 주소를 가리키고 , 메모리상의 주소에는 데이터가 저장되므로 포인터는 메모리에 저장된 데이터의 위치를 가리킨다 .

포인터의 예엘리베이터의 층별 버튼을 누르면 그 버튼이 가리키는 해당 층으로 이동휴대전화의 단축번호편리하고 빠르기 때문에 이러한 방법을 사용하는 것이다 .

Page 7: 14 .   포인터

변수와 메모리 주소 , 포인터변수에 저장된 데이터는 메모리상의 어디엔가 위치하는데 메모리는 기본적으로 1 byte 단위로 구분되어 있으므로 1 byte 마다 구별되는 주소가 있다 .

그런데 변수는 그 곳에 저장할 데이터의 형에 따라 그 크기가 달라진다 . 변수의 데이터 형이 char 형이라면 그 변수는 1 byte 크기의 방 1 개를 차지하고 , double 형의 경우는 8 byte 크기이므로 1 byte 크기의 방 8 개를 차지하고 있는 것이다 .

따라서 포인터가 가리키게 될 데이터가 저장된 위치는 데이터 형의 크기와 상관없이 해당 데이터가 저장되어 있는 첫 번째 byte 의 주소를 가리킨다 .

Page 8: 14 .   포인터

데이터가 저장된 변수들의 주소

실행결과

printf 에서 변수 앞에 붙은 & 연산자는 해당 변수의 주소를 알려주는 주소 연산자이며 , 변수의 주소를 정수형으로 출력할 때는 %d 또는 %u( 부호 없는 정수형 ) 를 , 16 진수로 출력할 때는 %p 를 사용

char 형 변수 : 1 byteint 형 변수 : 4 byte

Page 9: 14 .   포인터

[ 실습문제 ][ 예제 14-1] 의 line 05 를 double k=8; 로 수정하여 결과를 확인하고 ,

앞의 [ 그림 ]( 변수에 대한 메모리상의 위치 ) 과 같이 나타내시오 .

실습문제 정답

double k=8;

Page 10: 14 .   포인터

메모리 주소를 저장하는 포인터 변수포인터는 주소를 가리키며 , 포인터 변수는 주소를 저장하는 변수포인터 변수에는 오직 주소만을 저장할 수 있다 . 포인터 변수도 값을 기억하는 변수이므로 사용하기 전에 선언해야 하며 , 변수와 같이 저장된 값을 다른 주소로 변경시킬 수 있다 .

일반 변수와 구별하기 위해서 변수 앞에 간접 (indirection) 연산자 * 를 사용

Page 11: 14 .   포인터

메모리 주소를 저장하는 포인터 변수

포인터 변수 p 의 선언

변수 k 의 주소를 포인터 변수 k 에 저장

실행결과

포인터 변수 p 가 가리키는 곳에 저장된 데이터

Page 12: 14 .   포인터

메모리 주소를 저장하는 포인터 변수

p=&k; 의 결과

p=&i; 의 결과

Page 13: 14 .   포인터

메모리 주소를 저장하는 포인터 변수

p=&k; 의 결과

*p=i; 의 결과

Page 14: 14 .   포인터

포인터와 관련된 연산자

Page 15: 14 .   포인터

[ 참고 ] 포인터 변수의 크기는 ?포인터 변수는 실제 메모리 주소 값만을 저장하는데 왜 데이터 형이 필요할까 ?포인터 변수의 실제 크기는 어떻게 될까 ?

포인터 변수의 데이터 형은 포인터 변수가 가리키게 될 주소에 저장된 데이터의 형을 말한다 . Visual C++ 와 같은 32 bit 컴파일러에서 메모리 주소는 4 byte 로 표현하기 때문에 포인터 변수의 크기도 4 byte 가 된다 .

따라서 포인터 변수를 다음과 같이 여러 데이터 형으로 선언했다 하더라도 포인터 변수 자체의 크기는 4 byte 의 크기를 갖는다 .

Page 16: 14 .   포인터

[ 실습문제 ]두 개의 정수형 변수 a 와 b 에 임의 값으로 초기화하고 , 포인터 변수만을

이용하여 두 변수의 값을 바꾸는 프로그램을 작성하시오 .

일반적인 교환 방법 실습문제 정답

int a=3, b=5, c;c=a;a=b;b=c;

Page 17: 14 .   포인터

포인터와 배열배열 요소들은 메모리 상에 연속된 기억 공간에 저장된다 .

배열의 이름은 그 배열의 첫 번째 요소가 저장되어 있는 주소를 가리키므로 주소를 가리킨다는 점에서는 배열과 포인터는 유사하다 .

그러나 포인터 변수는 다른 주소를 저장할 수 있는 반면에 배열의 이름은 첫 번째 요소가 저장되어 있는 주소를 가리키는 상수이다 .

변수는 대입 연산자에 오른쪽과 왼쪽 모두 사용할 수 있지만 , 상수는 값을 저장하는 공간이 아니므로 대입 연산자의 왼쪽에 사용할 수 없다 .

배열과 포인터는 공통점도 있고 , 차이점도 있으나 배열을 사용하는 프로그램에서는 포인터 변수와 함께 사용되는 경우가 많다 .

Page 18: 14 .   포인터

포인터와 배열

실행결과

Page 19: 14 .   포인터

[ 실습문제 ]다음 프로그램을 실행하여 결과를 확인하고 문자들이 메모리상에 어떻게

저장되어 있는지를 [ 그림 ]( 배열요소가 저장공간에 기억된 형태 ) 과 같이

나타내시오 .

실습문제 정답

Page 20: 14 .   포인터

포인터에 대한 연산

실행결과

포인터 변수에는 주소가 저장되고 주소는 4 byte(Visual C++) 로 표현된 숫자이므로 포인터 변수나 주소에 대한 연산이 가능 . 그러나 주소는 양의 정수로 표현하므로 실수 연산은 사용할 수 없다 .

Page 21: 14 .   포인터

포인터 연산*(pt+2) 과 *pt+2 의 차이

*(pt+2) 는 (pt+2) 가 가리키는 곳의 값 a[2] 를 의미 . *pt+2 에서 pt 에는 배열의 시작 주소가 저장되어 있으므로 *pt+2 의 의미는 a[0]+2 와 같다 .

요약

Page 22: 14 .   포인터

포인터 연산

포인터 변수에 대한 증가 또는 감소 연산자 (++, --) 의 사용은 포인터 변수에 저장된 주소를 변경시키게 되므로 포인터가 가리키는 대상이 달라진다 .

pt=a; 의 결과 pt++; 의 결과

Page 23: 14 .   포인터

[ 참고 ] 포인터와 변수의 데이터 형이 일치해야 하는 이유char *pt; 라 함은 포인터 변수 pt 의 크기를 1 byte 크기로 하라는 것이 아니라 , 포인터 pt 가 가리키게 될 주소의 데이터 형이 char 형이 됨을 의미한다 . 따라서 char 형으로 선언된 변수의 주소를 포인터 하려면 char 형의 포인터 변수를 사용해야 하고 , double 형으로 선언된 변수의 주소를 포인터 하려면 double 형의 포인터 변수가 필요하다 .

컴파일 오류

Page 24: 14 .   포인터

[ 참고 ] 포인터와 변수의 데이터 형이 일치해야 하는 이유

포인터 변수는 데이터 형에 관계 없이 4 byte 의 크기를 갖는다 .

앞에서 오류가 발생되는 이유를 쉽게 설명하면 char 형 포인터와 int 형 포인터가 각각 가리키게 될 메모리의 크기가 서로 다르기 때문이다 .

즉 , char 형 포인터는 포인터가 가리키게 될 주소가 1 byte 의 크기이지만 int 형 포인터는 포인터가 가리키는 주소가 4 byte 의 크기를 갖는 첫 번째 주소가 되기 때문이다 .

따라서 포인터 변수에 대입할 변수 역시 같은 데이터 형을 사용해야 한다 .

Page 25: 14 .   포인터

[ 실습문제 ]다음 프로그램의 실행결과를 예측해 보고 , 실행결과를 확인하시오 .

실습문제 정답

pt pt++ pt=pt+2

출력결과 : coy

Page 26: 14 .   포인터

포인터와 문자열 한 개의 문자열은 1 차원 문자형 배열에 저장하고 , 두 개 이상의 문자열은 2 차원 문자형 배열에 저장하여 사용

포인터 변수에 문자열 초기화 방법

포인터 변수에 저장할 경우에는 크기를 지정할 필요가 없다 .

포인터 변수는 문자열 자체를 보관하는 것이 아니라 그 문자열이 저장된 첫 번째 주소를 보관하기 때문이다 .

Page 27: 14 .   포인터

포인터와 문자열

실행결과

Page 28: 14 .   포인터

포인터 배열 포인터 배열이란 여러 개의 포인터 변수를 배열로 사용하는 것포인터 배열은 문자형 포인터 배열을 사용할 때 유용하게 사용된다 .

문자형 2 차원 배열과 포인터 배열의 차이

Page 29: 14 .   포인터

포인터 배열

실행결과

2 차원 문자형 배열 na 와 포인터 배열 ct 의 첨자에 대한 사용방법은 동일하다 .

따라서 line 10 과 12 의 na[2] 와 ct[2] 는 각각 "Germany" 가 저장된 첫 번째 주소에서부터 '\0'(NULL) 이 나타날 때까지 출력

Page 30: 14 .   포인터

[ 참고 ] 문자열을 저장할 때 배열과 포인터의 차이

이배열 교수는 정확한 인원수가 결정되지 않았지만 여행을 가기 전에 숙소를 미리 예약을 해야 한다며 최대 인원인 40 명에 대해 메모리 호텔의 객실 41 개를 다음과 같이 예약 . "9 월 20 일부터 23 일까지 인솔자를 포함하여 객실 41 개를 예약하는데 , 41 개의 방은 서로 떨어지지 않게 인접한 방으로 잡아주시고 , 인솔자의 방을 첫 번째 방으로 해 주십시오 .“

김포인터 교수는 정확한 인원수가 결정되지 않아 자신이 묵을 객실 한 개만을 미리 예약하였습니다 . 출발 당일 여행을 갈 학생들과 같이 메모리 호텔에 가서 인원수만큼 연이어서 객실을 달라고 하였고 , 김포인터 교수는 학생들이 이용할 객실의 첫 번째 방 번호만 확인 .

호텔의 규정상 예약을 먼저 할 경우 , 취소와 객실 변경이 불가능하며 예약한 일정과 객실 수에 대해 숙박비를 받는다고 한다 .

누구의 방법이 더 효율적인가 ?

Page 31: 14 .   포인터

[ 실습문제 ]4 명에 대한 영문이름과 한글이름을 각각의 포인터 변수에 저장한 다음

출력하는 프로그램을 작성하시오 .

실습문제 정답

Page 32: 14 .   포인터

함수와 포인터

실행결과

Page 33: 14 .   포인터

함수를 호출할 때 인자의 전달 방식값에 의한 호출 (call by value) 과 참조에 의한 호출 (call by reference)

값에 의한 호출은 인자를 전달할 때 항상 그 값 (value) 만을 전달한다 .C 나 PASCAL 언어에서 함수를 호출할 때 , 일반적으로 사용하는 방법

참조에 의한 호출은 함수에 전달된 인수의 값이 함수 안에서 변경된 경우 , 함수를 호출한 쪽에도 영향을 미치는 것을 의미한다 .이러한 방법은 FORTRAN 언어에서 주로 사용하는 함수 호출 방법 .

앞에서 함수 swap2 에서 i 와 j 의 변경된 값이 함수를 호출한 main에도 영향을 주었으므로 참조에 의한 호출로 볼 수도 있겠지만 , 함수의 인자로 포인터 ( 주소 ) 를 이용함으로써 변수의 값이 변경 (side effect)된 것이므로 엄밀한 의미에서 참조에 의한 호출과는 다르다고 할 수 있다 .

결국 C 언어는 참조에 의한 호출을 하기 위해서는 포인터 ( 주소 ) 를 함수의 인자로 사용하는 간접적인 방법에 의해 처리할 수 있다 .

Page 34: 14 .   포인터

[ 실습문제 ]다음 프로그램의 실행결과를 예측해 보고 , 실행결과를 확인하시오 .

실습문제 정답

Page 35: 14 .   포인터

포인터는 어떤 변수의 주소를 가리키지만 함수의 주소에 대해서도 포인트 할 수 있다 . C 언어에서 문자열 상수 , 배열의 이름 그리고 함수의 이름은 모두 포인터 상수이며 , 함수 포인터를 사용하여 함수를 인자로 전달할 수 있다 . 함수 포인터는 다음과 같은 방법으로 선언한다 .

함수 포인터

포인터 pt 는 함수의 시작 주소를 저장할 수 있는 함수 포인터로서 , 사용자 정의 함수가 int plus(int x, int y); 라고 정의되어 있다면 함수 plus() 의 시작 주소를 함수 포인터에 저장할 수 있으며 , 함수 이름을 대신하여 호출할 수 있다 .

Page 36: 14 .   포인터

함수 포인터

pt=plus; 는 함수 plus 의 시작 주소를 함수 포인터에 저장하며 , pt(a, b) 는 마치 plus(a, b) 를 호출한 것과 같은 결과

함수 포인터는 프로그램에서 자주 사용하게 될 몇 개의 함수들을 배열에 저장하여 사용하거나 하나의 함수 포인터에 대해 조건에 따라 여러 함수들 중에서 하나의 함수를 포인터로 이용하고자 할 때 사용한다 .

실행 결과

Page 37: 14 .   포인터

[ 실습문제 ][ 예제 14-11] 의 line 02, 07, 09, 12 의 plus 를 한글 플러스로 바꾼 다음

실행결과를 확인하시오 .

실습문제 정답

플러스 Visual Studio 2010 Express Edition 에서는 변수이름 , 함수이름에 대해서도 한글을 사용할 수 있다 .

동일한 결과를 출력한다 .

Page 38: 14 .   포인터

함수의 결과값으로 배열을 반환하려면 포인터를 이용한다 .

앞에서 간단하게 배열의 이름은 포인터 상수라고만 설명하였으나 배열과 포인터는 컴퓨터 메모리의 주소를 나타낸다는 점에서 서로 유사하다 .

배열과 포인터 그리고 메모리 주소라는 것에 대해서는 다음 절에서 자세히 설명하기로 하고 , 여기에서는 단지 배열을 함수의 결과값으로 반환할 수 있다는 것에 대해서만 설명함 .

함수의 결과로 배열을 반환하는 방법

Page 39: 14 .   포인터

함수의 결과로 배열을 반환하는 방법지금까지 사용한 모든 변수나 배열 등은 사용된 데이터 형에 의해 컴파일 과정 에서 기억공간에 대한 크기가 결정 되는데 이를 정적 할당 (static allocation)

동적 할당 (dynamic allocation) 은 컴파일 과정이 아니라 프로그램의 실행 중에 기억공간을 확보n 개의 크기를 갖는 배열을 동적으로 할당하기 위해 함수 malloc 을 사용

실행 결과

Page 40: 14 .   포인터

함수를 선언할 때 함수의 앞부분에는 그 함수의 결과 값이 어떤 데이터 형인가를 명시해 주어야 하는데 함수의 결과 값으로 포인터를 사용하는 경우도 있다

함수의 결과 값으로 포인터를 반환하는 함수

위의 함수들의 경우에 함수의 결과 값으로 포인터를 반환하므로 함수들이 정상적으로 처리될 경우 에는 특정 주소를 반환하고 , 오류가 발생되면 대부분 NULL 을 결과 값을 반환한다 . 이렇게 함으로써 함수를 호출한 곳에서 결과를 알 수 있도록 한다 .

Page 41: 14 .   포인터

반복문 while 에 의해서 *src 즉 , 복사할 내용의 문자열을 차례로 읽어 가면서 *p 에 저장해 나가되 NULL(거짓 ) 이 될 때 까지 계속 순환 . . 문자의 복사가 끝나면 제일 마지막에 NULL 을 추가하고 문자열의 포인터를 반환

함수의 결과 값으로 포인터를 반환하는 함수

함수 strcpy 는 두 개의 인자를 필요로 하는데 두 번째 인자로 키워드 const 를 사용한다 . 키워드 const 가 사용된 변수는 그 값을 상수로 간주하므로 프로그램에서 값을 변경할 경우 오류가 발생된다 . 따라서 함수 strcpy 를 호출할 때 함수로 하여금 인자의 값을 변경할 수 없도록 하는 것이다 .

함수 strcpy 를 호출한 결과 , 문자형 배열 str1에는 문자열 상수인 "compile" 이 저장된다 .

strcpy 의 함수 정의

Page 42: 14 .   포인터

함수의 결과 값으로 포인터를 반환하는 함수

실행 결과

포인터 변수 pt 에는 str 의 주소가 저장되므로 동일한 주소를 가리키며 출력된 문자열도 동일하게 나타난다 .

Page 43: 14 .   포인터

문자열처리와 관련된 라이브러리 함수

실행 결과

char 형 포인터 변수에 문자열을 입력 받는 프로그램 . 이 예제에서 포인터 변수 str 의 크기는 20 이므로 최대 19 자까지 입력 받을 수 있다 .

동적 할당 (dynamic allocation) 은 컴파일 과정이 아니라 프로그램의 실행 중에 기억공간을 확보 .20 개의 크기를 갖는 공간을 동적으로 할당하기 위해 함수 malloc을 사용

Page 44: 14 .   포인터

함수 itoa 는 inter to ascii, 함수 ltoa 는 long to ascii 의 의미로서 정수형 숫자를 2 진수 , 8 진수 , 10 진수 또는 16 진수의 문자열로 변환한다 .이 함수들은 헤더 파일 <stdlib.h> 를 필요로 한다 .

문자열처리와 관련된 라이브러리 함수

숫자를 문자열로 변환하는 함수

Page 45: 14 .   포인터

문자열처리와 관련된 라이브러리 함수

실행 결과

Page 46: 14 .   포인터

문자열처리와 관련된 라이브러리 함수

실행 결과

Page 47: 14 .   포인터

문자열을 변환하는 함수들의 이름 대부분은 str 로 시작하며 이는 string 의 약어로서 문자열을 의미한다 . 다음의 함수들은 문자열을 숫자로 변환하는 함수이나 특정 진법으로 표현된 문자열을 정수로 변환한다 . 즉 , 앞에서의 itoa 와 반대의 기능을 하는 함수이 함수들은 헤더 파일 <stdlib.h> 을 필요로 한다 .

문자열처리와 관련된 라이브러리 함수

문자열을 숫자로 변환하는 함수

Page 48: 14 .   포인터

문자열처리와 관련된 라이브러리 함수

실행 결과

Page 49: 14 .   포인터

다음의 함수들은 두 개의 문자열을 연결하는 함수이며 헤더파일 <string.h> 을 필요로 한다 .

문자열처리와 관련된 라이브러리 함수

두 문자열을 연결하는 함수

Page 50: 14 .   포인터

문자열처리와 관련된 라이브러리 함수

실행 결과

Page 51: 14 .   포인터

문자열처리와 관련된 라이브러리 함수

두 문자열을 비교하는 함수

Page 52: 14 .   포인터

문자열처리와 관련된 라이브러리 함수

실행 결과

문자열 s1 과 s2 는 첫 12 개 문자열 ("Republic of ") 은 같지만 이후의 문자열에서 차이가 있다 .

Page 53: 14 .   포인터

[ 실습문제 ]라이브러리 함수 strcat 를 사용자 정의 함수 my_strcat 로 작성하시오 .

함수의 데이터 형은 void 로 처리하시오 .

실습문제 정답

Page 54: 14 .   포인터

다음은 문자열을 복사하거나 문자열의 길이를 계산하는 함수이 함수들은 헤더파일 <string.h> 를 필요로 한다 .

문자열처리와 관련된 라이브러리 함수

문자열의 복사와 길이계산 함수

Page 55: 14 .   포인터

문자열처리와 관련된 라이브러리 함수

실행 결과

Page 56: 14 .   포인터

문자열처리와 관련된 라이브러리 함수

실행 결과

Page 57: 14 .   포인터

[ 실습문제 ]라이브러리 함수 strcpy 를 사용자 정의 함수 my_strcpy 로 작성하시오 .

함수의 데이터 형은 void 로 합니다 .

실습문제 정답

Page 58: 14 .   포인터

[ 실습문제 ]라이브러리 함수 strlen 을 사용자 정의 함수 my_strlen 으로 작성하시오 .

함수의 데이터 형은 int 로 합니다 .

실습문제 정답

Page 59: 14 .   포인터

키워드 const키워드 const 는 constant 의 줄임말로 상수를 의미한다 .상수로 정의된 변수는 그 값을 프로그램 상에서 변경할 수 없고 , 만약 프로그램 상에서 변수로 사용한다면 컴파일 오류가 발생한다 . #define 에 의해서도 매크로 상수를 정의할 수 있는데 #define 과 const 의 차이는 다음과 같다 .

또 다른 차이는 #define 은 전처리기 중의 하나로서 이 부분은 컴파일 하기 이전에 전처리기에 의해 처리되며 , const 에 의한 상수는 컴파일러에 의해 변수로써 만들어지지만 컴파일러가 그 변수를 상수로만 처리할 수 있도록 한다 . const 는 일반 변수를 상수로 정의하는데 사용되며 , 배열이나 포인터에 대해 그 값을 또는 주소가 가리키는 곳의 값을 사용할 수는 있지만 변경할 수는 없도록 하는데 사용한다 .

Page 60: 14 .   포인터

키워드 const배열 str1 은 상수가 아닌 일반 배열이므로 line 07 과 같이 다른 값 ('a') 을 대입할 수 있지만 , 배열 str2 는 상수이므로 line 10과 같이 대입 연산자를 이용하여 값을 변경할 수 없다 . 그러나 포인터 변수 ptr 은 상수로 정의되어 있지만 line 08 과 11 과 같이 하나의 변수로서 주소를 대입할 수는 있지만 line 09 와 12 같이 포인터가 가리키는 곳의 값은 변경할 수 없다 .

Page 61: 14 .   포인터

[ 단원정리 ] 1/14

포인터란 ?포인터는 메모리상의 어떤 주소를 가리키고 , 메모리상의 주소에는 데이터가 저장되므로 결국 포인터는 메모리에 저장된 데이터의 위치를 가리킨다 .

포인터 변수는 ?

주소를 저장하는 변수이므로 데이터 형이 있으며 사용하기 전에 선언해야 한다 . 일반 변수와는 달리 포인터 변수에는 오직 주소만을 저장할 수 있다 .

Page 62: 14 .   포인터

[ 단원정리 ] 2/14

포인터와 관련된 연산자

포인터 연산자와 포인터 변수의 사용방법

Page 63: 14 .   포인터

[ 단원정리 ] 3/14

포인터 변수의 크기와 데이터 형

포인터 변수의 데이터 형은 포인터 변수가 가리키게 될 주소에 저장된 데이터의 형을 말한다 . 메모리 주소는 4 byte 의 크기로 나태내므로 포인터 변수를 다음과 같이 여러 데이터 형으로 선언했다 하더라도 포인터 변수 자체의 크기는 4 byte 의 크기를 가진다 .

Page 64: 14 .   포인터

[ 단원정리 ] 4/14

포인터와 배열배열의 이름은 그 배열의 첫 번째 요소가 저장되어 있는 주소를 가리키므로 주소를 가리킨다는 점에서는 배열과 포인터는 유사하다 . 그러나 포인터 변수는 다른 주소를 저장할 수 있는 반면에 배열의 이름은 첫 번째 요소가 저장되어 있는 주소를 가리키는 상수다 .

Page 65: 14 .   포인터

[ 단원정리 ] 5/14

포인터에 대한 연산포인터 변수에는 주소가 저장되고 주소는 4 byte 로 표현된 숫자이므로 포인터 변수나 주소에 대한 연산이 가능하다 . 그러나 주소는 양의 정수로 표현하므로 실수 연산은 사용할 수 없다 .

Page 66: 14 .   포인터

[ 단원정리 ] 6/14

포인터와 변수의 데이터형이 일치해야 하는 이유는 ?char 형은 메모리 상에 1 byte 크기의 공간을 갖는데 char *pt; 라 함은 포인터 변수 pt 의 크기를 1 byte 크기로 하라는 것이 아니라 , 포인터 pt 가 가리키게 될 주소의 데이터 형이 char 형이 됨을 의미한다 . 따라서 char 형으로 선언된 변수의 주소를 포인터 하려면 char 형의 포인터 변수를 사용해야 하고 , double 형으로 선언된 변수의 주소를 포인터 하려면 double 형의 포인터 변수가 필요하다 .

Page 67: 14 .   포인터

[ 단원정리 ] 7/14

포인터와 문자열C 언어에는 문자를 저장하는 char 형은 있지만 문자열을 저장하는 데이터 형은 따로 없으므로 다음과 같이 배열 또는 포인터를 이용하여 문자열을 초기화 할 수 있다 .

[ 방법 1] 의 배열을 이용하는 방법은 배열의 초기화에서만 사용이 가능하고 , 프로그램 내에서는 배열 이름인 str1 이 문자열 "copy" 의 시작 주소를 가리키는 포인터 상수이므로 str1="test"; 와 같이 다른 문자열을 대입할 수 없다 .

반면 [ 방법 2] 의 포인터 변수 str2 는 변수이므로 str2="test"; 와 같이 사용할 수 있고 , 다른 주소를 할당할 수 있으며 연산도 가능하다 .

Page 68: 14 .   포인터

[ 단원정리 ] 8/14

포인터 배열이란 ?여러 개의 포인터 변수를 배열로 사용하는 것이다 . 포인터 배열은 문자형 포인터 배열을 사용할 때 유용하게 사용한다 .

Page 69: 14 .   포인터

[ 단원정리 ] 9/14

함수의 인자로 포인터를 사용하는 방법함수를 호출할 때 인자의 전달 방식값에 의한 호출 (call by value) 과 참조에 의한 호출 (call by reference)

Page 70: 14 .   포인터

[ 단원정리 ] 10/14

함수 포인터란 ? C 언어에서 함수의 이름은 그 함수가 시작되는 주소를 나타내는 포인터 상수이므로 함수 포인터를 사용하여 함수를 인자로 전달할 수 있다 .

Page 71: 14 .   포인터

[ 단원정리 ] 11/14

함수의 결과로 배열을 반환하는 방법

함수의 결과값으로 배열을 반환하려면 포인터를 이용한다 .

결과값으로 반환하는 배열은 컴파일과정에서 그 값이 정해진 것이 아니라 실행 중에 함수 호출에 의해서 새롭게 만들어지는 것이므로 n 개의 크기를 갖는 배열을 동적으로 할당하기 위해 함수 malloc을 사용한다 .

Page 72: 14 .   포인터

[ 단원정리 ] 12/14

함수의 결과 값으로 포인터를 반환하는 함수

위의 함수들의 경우에 함수의 결과 값으로 포인터를 반환하므로 함수들이 정상적으로 처리될 경우 에는 특정 주소를 반환하고 , 오류가 발생되면 대부분 NULL 을 결과 값을 반환한다 . 이렇게 함으로써 함수를 호출한 곳에서 결과를 알 수 있도록 한다 .

Page 73: 14 .   포인터

[ 단원정리 ] 13/14

문자열과 관련된 라이브러리 함수들

Page 74: 14 .   포인터

[ 단원정리 ] 14/14

문자열과 관련된 라이브러리 함수들