컴퓨터프로그래밍 Computer Programming
08 포인터기초
목차 1. 포인터변수와선언 2. 간접연산자 * 와포인터연산 3. 포인터형변환과다중포인터 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 3
1. 포인터변수와선언
주소개념 주소 address 메모리공간은 8비트인 1 바이트마다순차적인고유한번호 메모리주소는저장장소인변수이름과함께기억장소를참조하는또다른방법 렉슬아파트 와같이아파트이름이변수이름 선릉로 888 과같이도로명과번호가메모리주소 메모리주소가왜필요하지요? 보다편리하고융통성있는프로그램이가능 주소정보를이용하여주소가가리키는변수의값을참조가능 주소정보의이전또는이후의이웃한저장공간의값도쉽게참조가능 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 5
주소개념 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 6
주소연산자 & 함수 scanf() 를사용하면서인자를 & 변수이름 으로사용 바로 &(ampersand) 가피연산자인변수의메모리주소를반환하는주소연산자 함수 scanf() 에서입력값을저장하는변수의주소값이인자의자료형 함수 scanf() 에서일반변수앞에는주소연산자 & 를사용 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 7
Source Code #01: address.c 변수의값과주소값을출력 변수의주소값출력 형식제어문자 %u 또는 %d 로직접출력 최근비주얼스튜디오에서는경고가발생하니주소값을 int 또는 unsigned 로변환하여출력 만일 16 진수로출력 형식제어문자 %p 를사용 & 연산자는 & 변수 와같이피연산자앞에위치하는전위연산자로변수에만사용가능 &32 와 &(3+4) 은오류 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 8
포인터변수 주소값을저장하는변수 변수의주소값은반드시포인터변수에저장 일반변수에는일반자료값이저장 일반변수와구별되며선언방법이다름 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 9
메모리주소를저장하는포인터변수 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 10
포인터변수선언 선언방법 포인터변수선언에서자료형과포인터변수이름사이에연산자 *(asterisk) 를삽입 ptrint, ptrshort, ptrchar, ptrdouble 은모두포인터변수 간단히포인터라고도부름 예로 int *ptrint 선언 int 포인터 ptrint 라고읽도록 변수자료형이다르면 그변수의주소를저장하는포인터의자료형도반드시달라야함 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 11
포인터변수선언 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 12
Source Code #02: pointer.c 변수의값과주소값의대입과활용 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 13
포인터선언과대입 포인터변수도선언된후초기값이없으면의미없는쓰레기 garbage 값이저장 문장 ptrint = &data; 포인터변수 ptrint 에변수 data 의주소를저장하는문장 &data 에서 ptrint 로의화살표 포인터변수 ptrint 에변수 data 의주소가저장되었다는의미 이러한관계를 포인터변수 ptrint 는변수 data 를가리킨다 또는 참조 reference 한다 라고표현 포인터변수는가리키는변수의크기 종류에관계없이크기가모두 4 바이트 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 14
포인터선언과대입 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 15
Lab #01: 다양한자료형포인터변수선언에의한주소값출력 자료형 char, int, double 의변수와포인터변수선언과활용하는프로그램 char 포인터변수선언 : char *pc int 포인터변수선언 : int *pm double 포인터변수선언 : double *px 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 16
2. 간접연산자 * 와포인터연산
Source Code #03: nullpointer.c 포인터변수와 NULL 의활용 포인터변수도초기값을저장하도록 아니면 NULL 을저장 초기값을지정하지않은포인터변수 ptr2 를출력 warning C4101: ptr2 : 참조되지않은지역변수입니다. 라는컴파일오류가발생 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 18
간접연산자 * 간접연산자 indirection operator * 를사용 포인터변수가갖는주소로그주소의원래변수를참조가능 포인터변수가가리키고있는변수를참조 간접연산자를이용한 *ptrint 포인터 ptrint 가가리키고있는변수자체를의미 직접참조direct access 변수 data 자체를사용해자신을참조하는방식 간접참조indirect access *ptrint 를이용해서변수 data 를참조하는방식 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 19
간접연산자 * 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 20
Source Code #04: dereference.c 포인터변수와간접연산자 * 를이용한간접참조 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 21
연산자 & 와 * 주소연산자 & 와간접연산자 *, 모두전위연산자로서로반대의역할 주소연산 & 변수 는변수의주소값이결과값 간접연산 * 포인터변수 는포인터변수가가리키는변수자체가결과값 * 포인터변수 는 l-value 와 r-value 로모두사용이가능 주소값인 & 변수 는 r-value 로만사용이가능 * 포인터변수 와같이간접연산자는포인터변수에만사용이가능 주소연산자는 & 변수 와같이모든변수에사용이가능 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 22
주소연산 포인터변수는간단한더하기와뺄셈연산 이웃한변수의주소연산을수행가능 포인터가가리키는변수크기에비례한연산 포인터의연산은절대적인주소의계산이아님 포인터에저장된주소값의연산으로이웃한이전또는이후의다른변수를참조 int 형포인터 pi 에저장된주소값이 100 이라고가정 (pi+1) 은 101이아니라주소값 104 즉 (pi+1) 은 pi가가리키는다음 int형의주소를의미 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 23
주소연산 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 24
Source Code #05: calcptr.c 다양한자료형의주소연산과주소값출력 포인터 pd 에정수 100 을직접저장하면경고가발생 double *pd = 100; // 경고발생 double *pd = (double *)100; // 가능하나잘이용하지않음 double 형포인터에 100 이라는주소값을저장 포인터자료형으로 100 을변환하는연산식 (double *) 100 을사용해저장가능, 권장하지않음 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 25
Source Code #06: neighborvar.c int 자료형의주소연산과주소값출력 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 26
이웃한변수주소 int 형변수 3 개를선언해그저장값과주소값을출력 일반적으로정수 int 와 int 사이는주소값으로그차이가절대값으로 12 정도 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 27
Lab #02: 포인터를이용하여두수의값을교환하는프로그램 정수 int 자료형변수 m, n 에저장된두값을서로교환하는프로그램 제한사항 결과 임시변수인 dummy 를사용하고, 포인터변수 p 를사용하나변수 m, n 자체는사용하지않으며, 주소값 &m 과 &n 만을사용 포인터변수선언 int *p = &m; 으로 *p 는 m 자체를의미함 마찬가지로대입문장 p = &n; 으로 *p 는 n 자체를의미함 100 200 200 100 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 28
3. 포인터형변환과다중포인터
내부저장표현 변수 value 에 16 진수 0x61626364 를저장 만일변수 value 의주소가 56번지라면 56번지에는 16진수 64가저장 다음주소 57번지에는 63이저장 다음에각각 62, 61이저장 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 30
Source Code #07: ptrtypecast.c 정수의내부를각각 1 바이트씩문자로출력 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 31
명시적포인터형변환 포인터변수는동일한자료형끼리만대입이가능 포인터의자료형이다르면경고가발생 필요하면명시적으로형변환을수행가능 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 32
다중포인터 이중포인터 포인터변수의주소값을갖는변수 삼중포인터 다시이중포인터의주소값을갖는변수 다중포인터 포인터의포인터 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 33
이중포인터의메모리와변수 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 34
Source Code #08: multipointer.c 포인터와이중포인터의활용 다중포인터변수를이용하여일반변수를참조하려면가리킨횟수만큼간접연산자를이용 즉이중포인터변수 dpi 는 **dpi 가바로변수 i 문장 *pi = i + 2; 는변수 i 를 2 증가시키는문장 포인터변수 pi 에서 *pi 도변수 i 문장 **dpi = *pi + 2; 는변수 i 를 2 증가시키는문장 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 35
간접연산자와증감연산자활용 간접연산자 * 는증감연산자 ++, -- 와함께사용하는경우 간접연산자 * 는전위연산자로연산자우선순위가 2 위 증감연산자 ++, -- 는전위이면 2 위이고, 후위이면 1 위 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 36
간접연산자와증감연산자활용 사용사례 *p++ 는 *(p++) 으로 (*p)++ 와다르다. ++*p와 ++(*p) 는같다. *++p 는 *(++p) 는같다. 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 37
Source Code #09: variousop.c 간접연산자와증가연산자의활용 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 38
Source Code #10: constptr.c 포인터상수활용 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 39
포인터상수 *pi 를사용해포인터 pi 가가리키는변수인 i 를수정할수없도록하는상수선언방법 즉간접연산식 *pi 을상수로만들면 *pi 를 l- value 로사용할수없음 1 번과동일한문장으로간접연산식 *pi 를상수로만드는방법 포인터 pi 에저장되는초기주소값을더이상수정할수없도록하는상수선언방법 즉포인터변수 pi 자체를상수로만드는방법으로, 선언이후 pi 를 l-value 로사용할수없음 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 40
Lab #03: 두실수의덧셈을포인터변수를사용해수행하고출력 자료형 double 로선언된두 x 와 y 에표준입력으로두실수를입력받아두실수의덧셈결과를출력하는프로그램 제한사항 두변수 x 와 y 는선언만수행하며, 포인터변수인 px 와 py 만을사용하여모든과정을코딩 double 포인터변수 px 선언 : double *px = &x; double 포인터변수 py 선언 : double *py = &y; 결과 두실수입력 : 3.874 7.983 3.87 + 7.98 = 11.86 컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 41
컴퓨터프로그래밍 (Computer Programming) - 08 포인터기초 42