160 likes | 326 Views
C 언어 (9). 정명희. 포인터. 포인터 어떤 변수의 메모리 주소 배열변수명은 그 배열이 할당 받은 메모리의 선두주소 배열변수명 역시 포인터 포인터 (pointer) 는 메모리상의 어떤 주소를 가리키고 , 메모리상의 주소에는 데이터가 저장되므로 결국 포인터는 메모리에 저장된 데이터의 위치를 가리킴 함수의 한계 극복 연결 리스트 (linked lsit) 나 이진트리 (binary tree) 등 자료구조를 구현하는데 폭 넓게 사용. ch 의 포인터 : 1245052 in 의 포인터 : 1245048
E N D
C언어 (9) 정명희
포인터 • 포인터 • 어떤 변수의 메모리 주소 • 배열변수명은 그 배열이 할당 받은 메모리의 선두주소 • 배열변수명 역시 포인터 • 포인터(pointer)는 메모리상의 어떤 주소를 가리키고, 메모리상의 주소에는 데이터가 저장되므로 결국 포인터는 메모리에 저장된 데이터의 위치를 가리킴 • 함수의 한계 극복 • 연결 리스트(linked lsit)나 이진트리(binary tree)등 자료구조를 구현하는데 폭 넓게 사용.
ch의 포인터 : 1245052 in의 포인터 : 1245048 db의 포인터 : 1245040 포인터(주소연산자) • 특정 변수의 포인터를 구하기 위해서 주소연산자(&)사용. char ch; int in; double db; printf(“ch의 포인터 : %u\n”, &ch); printf(“in의 포인터 : %u\n”, &in); printf(“db의 포인터 : %u\n”, &db); // char형 변수의 주소값 // int형 변수의 시작 주소값 // double형 변수의 시작 주소값
포인터 변수 (1) • 주소를 가리키며, 주소를 저장하는 변수 • 일반 변수와 달리 포인터 변수에는 오직 주소만 저장 • 사용하기 전에 선언 • 변수와 같이 저장된 값을 다른 주소로 변경 가능 • 선언 • 데이터 형과 변수 이름 사용 • 변수 앞에 간접(indirection) 연산자 * 사용 • 데이터형 * 포인터 변수 • 예) char *p • 포인터 변수 p의 데이터형이 char 가 아님 • P가 가리키데 될 주소에 저장된 데이터의 형이 char형임
포인터 변수 (2) • 포인터의 선언 • 자료형 * 변수명; • 예) int *ptr;
포인터 변수 (3) • 포인터 연산자 • & • & 다음에 표시된 변수의 주소를 나타냄 • * • 포인터가 가리키는 곳의 값을 나타냄 • 예제) • p=&i : 변수 i의 주소를 포인터 변수 p에 저장 • printf(“%u”,p) : 포인터 변수 p에 저장된 값(주소)를 출력 • printf(“%d”,*p) : 포인터 변수 p가 가리키는 주소에 저장된 값을 출력 • *p=4 : 포인터 변수 p가 가리키는 주소에 저장된 값을 4로 대체
char ch; int in; double db; *&ch = ‘P’; *&in = 100; *&db = 3.14; printf(“변수 ch에 저장된 문자 : %c\n”, ch); printf(“변수 in에 저장된 값 : %d\n”, in); printf(“변수 db에 저장된 값 : %lf\n”, db); // 포인터 &ch가 가리키는 기억공간에 ‘P’를 저장한다. // 포인터 &in이 가리키는 기억공간에 100을 저장한다. // 포인터 &db가 가리키는 기억공간에 3.14를 저장한다. 변수 ch에 저장된 문자 : P 변수 in에 저장된 값 : 100 변수 db에 저장된 값 : 3.140000 포인터 변수 (4) • 포인터를 통해서 기억공간을 사용하기 위해서 참조연산자(*) 사용
포인터 변수 (5) • 예) int a = 10; int *ap = &a; printf(“%d”, a); printf(“%d”, *ap); printf(“%u”, &a); printf(“%u”, ap); printf(“%u”, &ap);
배열과 포인터 (1) • 배열은 첫번째 배열요소의 포인터만 알면 나머지 배열요소의 포인터도 쉽게 알 수 있다. • 각 배열요소의 포인터에 참조연산자를 사용하면 모든 값을 참조할 수 있다.
배열과 포인터 (2) • 포인터(변수)로 배열요소를 참조하는 방법. • 배열명을 사용한 배열표현 • 배열명을 사용한 포인터표현 • 배열명을 저장한 포인터변수를 사용한 포인터표현 • 배열명을 저장한 포인터변수를 사용한 배열표현
문자열과 포인터 (1) • 문자열의 초기화 • 배열 또는 포인터를 이용 • [방법 1] • 배열의 초기화에서만 사용 가능함. • 배열 크기 생략가능. • 배열 이름인 str1이 문자열 "copy"의 시작 주소를 가리키는 포인터 상수 • str1="test"; 와 같이 다른 문자열 대입가능. • 배열의 크기를 지정하는 경우에는 문자열 길이보다 하나 더 크게 지정 • [방법 2] • 포인터 변수 str2는 변수이므로 다른 주소를 대입하거나 연산가능 • 포인터 변수는 문자열 자체를 보관하는 것이 아니라 그 문자열이 저장된 첫 번째 주소를 보관
문자열과 포인터 (2) • 포인터 배열 • 여러 개의 포인터 변수를 배열로 사용하는 것 • 문자열을 저장할 때 배열과 포인터의 차이 • 문자열을 2차원 배열에 저장하는 경우 • 저장할 문자열의 최대 길이를 고려하여 배열의 크기를 선언 • 문자열의 길이가 길던 짧던 간에 동일한 크기의 공간에 저장됨 • 기억 공간의 낭비가 생김 • 문자열을 포인터 배열에 저장하는 경우 • 포인터 배열 요소에는 저장될 문자열의 시작 번지만 저장됨
문자열과 포인터 (4) • const 키워드 • const 키워드를 이용하여 변수를 상수화 시킬 수 있다. • ptr1은 포인터 변수가 참조하는 영역을 상수화 하였으므로 값을 변경할 수 없다. 그러나 변수 자신은 새로운 주소로 변경될 수 있다. • ptr2는 포인터 변수가 참조하는 영역은 변경할 수 있다. 그러나 변수 자신이 상수화 되므로 변수에 새로운 주소를 저장할 수 없다. const int *ptr1=# // 주소가 참조하는 내용 변경 불가 int * const ptr2=# // 포인터 변수에 저장된 주소 변경 불가
포인터와 함수 (1) • 일반적으로 포인터는 어떤 변수의 주소를 가리킴 • 함수의 주소에 대해서도 포인트 가능 • C 언어에서 문자열 상수, 배열의 이름 그리고 함수의 이름은 모두 포인터 상수임 • C 언어에서 함수의 이름은 그 함수가 시작되는 주소를 나타내는 포인터 상수이므로 함수 포인터를 사용하여 함수를 인자로 전달할 수 있음 • 포인터 pt는 함수의 시작 주소를 저장할 수 있는 함수 포인터 • 사용자 정의 함수가 int plus(int x, int y);라고 정의되어 있다면 함수 plus()의 시작 주소를 함수 포인터에 저장할 수 있으며, 함수 이름을 대신하여 호출할 수 있다.
포인터와 함수 (2) • 함수의 결과(반환) 값으로 포인터를 반환하는 함수 • 함수들이 정상적으로 처리될 경우에는 특정 주소를 반환하고, 오류가 발생되면 대부분 NULL을 결과 값으로 반환