제8장 포인터 문봉근.

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
포인터란? 사전적 의미로써 지시자 혹은 가리키는 것으로 풀이할 수 있으나, C프로그래밍 언어에서는 메모리의 주소를 저장하는 변수이다. 포인터 자체가 하나의 변수이기 때문에 포인터도 메모리 내에서 선언이 되며 일반 상수를 저장하는 변수가 아닌 주소값을 저장하는 변수라는 점에서.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
Part 11 문자열 ©우균, 창병모 ©우균, 창병모.
Chapter 14 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
제 9 장 구조체와 공용체.
-Part2- 제3장 포인터란 무엇인가.
윤 홍 란 포인터 윤 홍 란
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
자료 구조: Chapter 3 (2)구조체, 포인터
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C 7장. 배열과 문자열 #include <stdio.h> int main(void) { int num;
C 프로그래밍.
Dynamic Memory and Linked List
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
포인터 활용 포인터 활용.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
10장 포인터와 문자열 포인터 기본 배열과 포인터 매개변수 전달방법 포인터와 문자열.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express Slide 1 (of 32)
제8장 배열 1부 8.1 배열 8.2 배열의 초기화 8.3 배열의 응용 8.4 정렬과 탐색 8.5 다차원 배열.
14장. 포인터와 함수에 대한 이해.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 8 장 배열, 주소, 포인터.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
13. 포인터와 배열! 함께 이해하기.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
연산자 (Operator).
포인터 1차원 배열과 포인터 2차원 배열과 포인터 문자열 배열과 포인터 포인터 배열
제어문 & 반복문 C스터디 2주차.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 7 장 배열.
5장 배열과 문자열 C 프로그래밍.
8주차: Strings, Arrays and Pointers
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
18장. 다차원 배열 그리고 포인터.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
17장. 포인터의 포인터.
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
Pointers summary.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

제8장 포인터 문봉근

제8장 포인터 8.1 포인터의 의미 8.2 포인터 연산자 8.3 포인터 산술 연산자 8.4 배열과 포인터 8.5 포인터 배열 8.6 복잡한 포인터 이해하기

8.1 포인터의 의미 호출시 복사 반환시 복사 안함

포인터의 의미(계속) 정수변수, 실수변수, 문자변수 → 정수, 실수, 문자와 같은 자료를 저장 포인터변수 → 자료가 저장된 공간에 대한 주소를 저장 문법 자료형 *변수이름;

예제 8.1 int형과 char형을 지칭하는 포인터 선언. int *p; char *q;

예제 8.2 int형 변수와 int형을 지칭하는 포인터 선언. int a, b; int *ptr; a = 10; ptr = &a;

예제 8.3 변수의 값과 변수의 주소 출력하기 #include <stdio.h> #include <conio.h> void main(void) { int x; x = 100; printf("value of x = %d\n", x); printf("address of x = %x\n", &x); } 실행결과 value of x = 100 address of x = 12ff7c

8.2 포인터 연산자 pt=&a; 변수 a의 주소를 pt에 배정 a=*pt; 포인터 pt가 지칭한 값을 a에 배정

예제 8.4 포인터 연산자 사용하기 #include <stdio.h> #include <conio.h> void main(void) { int x; int *p; x = 100; p = &x; printf("value of *p = %d\n", *p); printf("value of p = %x\n", p); printf("address of p = %x\n", &p); } 실행결과 value of *p = 100 value of p = 12ff7c address of p = 12ff78

예제 8.5 변수와 포인터 그리고 이들 사이의 주소 관계 int x; /* statement 1 */ float y; /* statement 2 */ int *p; /* statement 3 */ float *q; /* statement 4 */ x=10; /* statement 5 */ y=0.89; /* statement 6 */ p=&x; /* statement 7 */ q=&y; /* statement 8 */

그림 8.2 변수와 포인터와의 관계 int x; float y; int *p; float *q; x 10 x=10; p=&x; q=&y; x 정수 변수 10 y 0.89 정수 변수 p 포인터 변수 Y의 주소 q 포인터 변수 X의 주소

예제 8.6 배열의 시작주소 출력하는 프로그램. #include <stdio.h> void main(void) {        int array[] = {100, 200, 300, 400, 500};        printf("array = %x\n", array);        printf("address of array[0] = %x\n", &array[0]); } 실행결과 array = 12ff6c address of array[0] = 12ff6c

8.3 포인터 산술연산자

예제 8.7 문자배열의 주소를 이용해서 문자열을 출력하는 프로그램. #include <stdio.h> #include <string.h> void main(void) { char c[10]; char *p; strcpy(c, "computer"); p = c; printf("%s\n", p); printf("%s\n", p+3); printf("%s\n", p+5); } 실행결과 computer puter ter

예제 8.8 정수배열의 내용을 포인터를 이용해서 출력하는 프로그램. #include <stdio.h> void main(void) {        int array[] = {100, 200, 300, 400, 500};        int *ptr;        ptr = array;        printf("%d\n", *ptr + 5);        printf("%d\n", *(ptr+2) + 5); } 실행결과 105 305

예제 8.9 포인터를 이용해서 정수 배열변수에 값을 저장하고 출력하는 프로그램. #include <stdio.h> void main(void) {        int x[3],*p;        x[1]=5;        p=&x[1];        *(p-1)=3;        *(p+1)=7;        printf("%d  %d  %d\n",*(p-1),*p,*(p+1)); } 실행결과 3 5 7

예제 8.10 포인터를 이용해서 정수 계산을 하고 출력하는 프로그램. #include <stdio.h> void main(void) { int a,b,*p1,*p2; a=10, b=20; p1=&a, p2=&b; *p1=*p1+3,*p2=*p2+3; printf("a+b = %d\n",a+b); } 실행결과 a+b = 36

예제 8.11 포인터가 지시하고 있는 메모리 속의 값을 1만큼 증가시켰을 때의 문자와 1만큼 감소시켰을 때의 문자를 각각 출력하는 프로그램. #include <stdio.h> #include <conio.h> void main(void) {        char x,*p;        x='Y';        p=&x;        printf("Original Character : %c\n",*p);        (*p)++;        printf("+1 Character : %c\n",*p);        (*p)--;        --(*p);        printf("-1 Character : %c\n",*p);        getch(); } 실행결과 Original Character : Y +1 Charater : Z -1 Character : X

예제 8.12 임의의 문자열을 입력하고, 역방향으로 출력하는 프로그램 #include <stdio.h> #include <conio.h> #include <string.h> void main(void) { char buffer[80], *p=buffer; int len,i=0; printf("Input String : "); scanf("%s",p); len = strlen(p); while (*p) p++; printf("Inverse String : ");

예제 8.12(계속) while (i<len) { p--; putchar(*p); i++; } putchar('\n'); getch(); 실행결과 ***Input String => Turbo-C ***Inverse String => C-obruT

8.4 배열과 포인터 int a[10];

문자열인 경우 char *S="C-Programming";

예제 8.13 배열 arr[3]을 선언하고 arr[0]=5, arr[1]=8, arr[2]=3 일 때 포인터를 사용하여 arr[0]×arr[1]×arr[2]를 구하는 프로그램. #include <stdio.h> #include <conio.h> void main(void) {        int arr[]={5,8,3};        int s,i,*p;        s=1;        p=&arr[0];        for (i=0;i<3;i++)                printf("arr[%d] = %d \n", i, arr[i]);                s=s**(p+i);        printf("\narr[0]*arr[1]*arr[2] = %d\n",s);        getch(); }

예제 8.14 배열 array[5]를 선언하고, array[0]=0,  array[1]=1, array[2]=2를 대입한 포인터를 사용하여 array[1]+array[3]+array[5]+array[7]+array[9]를 구하는 프로그램. #include <stdio.h> #include <conio.h> void main(void) {        int array[]={0,1,2,3,4,5,6,7,8,9};        int w,i,*p;        w=0;        p=&array[0];        for (i=0;i<10;i++)                printf("array[%d] = %d \n",i,array[i]);        for (i=0;i<9;i+=2)                w=w+*(p+i);        printf("\narray[1]+array[3]+array[5]+array[7]+array[9] = %d\n",w);        getch(); }

예제 8.15 정수값을 갖는 배열에서 최대값과 최소값을 찾는 프로그램. #include <stdio.h> #include <conio.h> void main(void) { int Arr[]={34,-67,24,-40,81,-12,13,94,3,20}; int i,*p,max=-1000,min=1000; int maxlocation,minlocation; p=&Arr[0]; printf(" Array[] = {");

예제 8.15(계속) for (i=0;i<10;i++) { if (*(p+i)>max) { max=*(p+i); maxlocation=i+1; } if (*(p+i)<min) { min=*(p+i); minlocation=i+1; } printf(" %d ",*(p+i)); } printf("}\n"); printf(" Maximum Value ==> %d , Location ==> %d\n", max, maxlocation); printf(" Minimum Value ==> %d , Location ==> %d\n", min, minlocation); getch();

예제 8.16 정수값을 갖는 배열에서 최대값과 최소값을 찾는 프로그램. #include <stdio.h> #include <conio.h> Change(char *x, char *y) {        char temp;        while(*x)  {                temp=*x;                *x=*y;                *y=temp;                x++;                y++;         }        return(temp); }

예제 8.16 (계속) void main(void) { static char a[]="ABCDEF";        static char b[]="!@#$%*";         printf("Before Change\n");        printf("-------------------------\n");        printf("a[] = %s \n",a);        printf("b[] = %s \n\n",b);        Change(a,b);        printf("After Change\n");        printf("b[] = %s \n",b);        getch(); }

예제 8.17 정수값을 갖는 배열에서 최대값과 최소값을 찾는 프로그램. #include <stdio.h> #include <conio.h> void main(void) {        char arr[]="programming";        char *ptr;        int bigchar;        ptr=arr;        printf(" before : %s \n\n",arr);        printf(" after  : ");        while (*ptr)        {                bigchar=*ptr-32;                printf("%c",bigchar);                ptr++;        }        printf("\n");        getch(); }

예제 8.18 정수값을 갖는 배열에서 최대값과 최소값을 찾는 프로그램. #include <stdio.h> #include <conio.h> void main(void) {        char arr[20];        char *ptr;        int bigchar,smallchar;        printf("\n before  : ");        scanf("%s",arr);        ptr=arr;        

예제 8.18 (계속) printf("\n after : "); while (*ptr) {        {                if ((*ptr>='a')&&(*ptr<='z'))                {                        bigchar=*ptr-32;                        printf("%c",bigchar);                        ptr++;                }                if ((*ptr>='A')&&(*ptr<='Z'))                        smallchar=*ptr+32;                        printf("%c",smallchar);        }        printf("\n");        getch(); }

예제 8.19 정수값을 갖는 배열에서 최대값과 최소값을 찾는 프로그램. #include <stdio.h> #include <conio.h> #include <string.h> void main(void) {        char arrx[20],arry[20];        char *xptr,*yptr;        int i,len;        printf("\n -----  first string : ");        scanf("%s",arrx);        printf("\n ----- second string : ");        scanf("%s",arry);        len=strlen(arrx);        xptr=arrx;        yptr=arry;        printf("\n");        for(i=0;i<len;i++)                if (*(xptr+i) == *(yptr+i))                        printf(" character => %c ,                                location =>  %d\n",*(xptr+i),i+1);        getch(); }

8.5 포인터 배열 배열의 각 요소가 포인터를 나타내는 것을 포인터 배열이라 한다. 문법 int *a[3]; 자료형 *배열 이름[요소의 갯수]; int *a[3];

그림 8.6 포인터 배열과 저장공간과의 관계

예제 8.20 일요일을 0으로 하고, 정수 n을 읽어들여 일요일로부터 n일째의 요일을 반환하는 프로그램. #include <stdio.h> #include <conio.h> #include <stdlib.h> char *DayName(int n) {        static char *Day[] = {                "Sunday",                "Monday",                "Tuesday",                "Wednesday",                "Thursday",                "Friday",                "Saturday"        };        return(Day[n]); }

예제 8.20(계속) void main(void) { int n; char *s;        printf(" 0'th dayname => Sunday\n");        printf(" ---- Enter n value  \n");        printf(" ---- n = ");        scanf("%d",&n);        if (n<0 || n>6) {                printf(" ******************************************\n ");                printf(" Wrong n value!!!   n's Range : 0<=n<=6 \n");                getch();                exit(0);        }        s=DayName(n);        printf(" %d'th dayname => %s\n\n",n,s);        getch(); }

예제 8.21 과일이름의 처음 문자를 입력하면 전체 과일이 름이 나올 수 있도록 switch문을 사용하여 프로그램 #include <stdio.h> #include <conio.h> char *fruit(char s) { switch(s) { case 'a':return("apple"); case 'b':return("banana"); case 'o':return("orange"); case 's':return("strawberry"); case 'g':return("grape"); case 'p':return("pineapple"); case 't':return("tomato"); default :return("Fruit name is not exist!!!"); }

예제 8.21(계속) void main(void) { char str[5]; printf(" input first one character => "); while (*gets(str) != 'Q') { printf(" *** fruit = %s \n\n", fruit(*str)); } getch();

예제 8.22 자동차 메이커와 자동차 이름을 각각 포인터 배열로 선언해 놓고, 메이커에 해당하는 문자열을 입력받은 뒤, 그에 해당하는 자동차 이름을 출력하는 프로그램. #include <stdio.h> #include <conio.h> #include <string.h> char *maker(int n) {        static char *makerName[] = {                        "KIA",                        "HYUNDAI",                        "DAEWOO",                        "SSANGYUNG"                        };        return(makerName[n]); } char *car(int m)        static char *carName[] = {                        "pride",                        "sonata",                        "espero",                        "korando"        return(carName[m]);

예제 8.22(계속) void main(void) { char str[20]; int k=0;        printf(" maker    => ");        scanf("%s",str);        while (maker(k))  {                if (!strcmp(str,maker(k)))  {                        printf(" car name => %s \n\n",car(k));                        break;                }                k++;        }        getch(); }

8.6 복잡한 포인터 이해하기 1. 변수의 이름은 ptr이다. 2. ptr은 포인터변수이다.

8.6 복잡한 포인터 이해하기(계속) 20 ptr 주소값 … : 10 배열 원소의 타입은 정수

예제 8.23 정수를 가리키는 크기가 10인 1차원 포인터배열 int *p[10]

예제 8.24 포인터의 포인터 선언 int **p p 1000 100 1 int형 값 주소값

8.7 함수 포인터 문법 반환자료형 (*포인터변수이름) (인수 리스트);

예제 8.26 int sum(int a, int b) { …중략 } int diff(int c, int d) { …중략 } int diff(int c, int d) int (*fptr) (int, int); void main(void) fptr = sum; i = fptr(2,3); fptr = diff; i = fptr(2,3); …중략

예제 8.27 함수포인터를 이용한 간단한 예 #include <stdio.h> void main(void) { int (*func_ptr) (const char *, ...); func_ptr = printf; func_ptr ("Hello world \n"); }

예제 8.27(계속) 1, func_ptr은 변수이다. 2. func_ptr은 포인터 변수이다. 3. 포인터는 함수를 가리킨다. 4. 함수의 결과 값은 정수이다. 5. 함수의 인수로써 첫 번째는 문자포인터이고 다음은 임의의 인수들이다.

예제 8.28 함수포인터를 이용해서 sin()함수와 cos()함수 이용하기 #include <stdio.h> #include <math.h> double sigma (double (*trig_func) (double), double dLower, double dUpper); void main(void) {        double dSum;        dSum = sigma(sin, 0.1, 1.0);        printf(" The sum of the sine from 0.1 to 1.0 is %lf\n", dSum);        dSum = sigma(cos, 0.5, 3.0);        printf(" The sum of the cosine from 0.5 to 3.0 is %lf\n", dSum); } double sigma(double (*trig_func)(double), double dLower, double dUpper)        double dCount, dTotal = 0.0;        for(dCount=dLower; dCount<=dUpper; dCount+=0.1)                dTotal = dTotal + trig_func(dCount);        return dTotal;