쉬운 포인터 설명



































































포인터포인터 이번장에서학습할내용.포인터이란? .변수의주소.포인터의선언.간접참조연산자.포인터연산.포인터와배열.포인터와함수이번장에서는포인터의기초적인지식을학습한다. 이번장에서학습할내용.포인터이란? .변수의주소.포인터의선언.간접참조연산자.포인터연산.포인터와배열.포인터와함수이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터란? □ 포인터(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);





Posted by MSNU