1 / 17

포인터 초기화

포인터 초기화. 포인터 변수에는 사용자가 직접 주소를 저장할 수 없다 . NULL 상수는 예외 int *ptr = 10000; ---(X) int *ptr = NULL; ---(O) NULL 상수 포인터의 초기화 값으로 주로 사용되며 포인터가 어떤 메모리도 가리키고 있지 않다는 의미로서 이용. int *ptr = NULL; ~ if ( ptr == NULL ) { printf(“ 그런 사람은 없습니다 .”); } else printf(“%s”, *ptr);.

jalene
Download Presentation

포인터 초기화

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 포인터 초기화 • 포인터 변수에는 사용자가 직접 주소를 저장할 수 없다. • NULL 상수는 예외 int *ptr = 10000; ---(X) int *ptr = NULL; ---(O) • NULL 상수 • 포인터의 초기화 값으로 주로 사용되며 포인터가 어떤 메모리도 가리키고 있지 않다는 의미로서 이용 int *ptr = NULL; ~ if ( ptr == NULL ) { printf(“ 그런 사람은 없습니다.”); } else printf(“%s”, *ptr);

  2. int * n n++후 n++후 10.2 포인터 변수의 연산 • 포인터 + 1 또는 포인터 -1 포인터의 “형” 에 따라 증가(감소)되는 값이 달라진다. 즉 (포인터가 가리키는) 자료형이 실제로 메모리를 차지하는 크기만큼 증가됨 int형 포인터  4 double형 포인터  8 char형 포인터  1 1 2 3 형 *포인터; : 포인터++;  포인터는 바로 다음 장소를 가리키게 됨다. 4 5 6

  3. no, dp 포인터의 1 증가와 1 감소 • double형 포인터라면 8byte씩 증가 double * dp; double no[3] dp = no; 1.0 (1) • dp++후 (1) (2) 2.0 dp++후 (2) 3.0

  4. 95 88 76 54 85 82 10.3 포인터와 배열 point가 가리키는 자료형인 int 형 자료 1개 크기(4bytes)만큼 덧셈이 됨 • 배열명 • 배열의 첫번째 원소를 가리키는 포인터 • int point[] = {95, 88, 76, 54, 85, 82}; point 100번지 95 88 76 • 결과는? • printf(“%d \n”, *point); • printf(“%d \n”, *(point+1)); • printf(“%d \n”, *(point+2)); 100(번지)

  5. 예제 10.6 프로그램 a P 1310572 1310576 1310580 1310584 1310588 a[0] a[1] a[2] a[3] a[4]  6 :  int a[5] = {111, 222, 333, 444, 555 };  7 :  int *p = a;     8 :  int i; 15 : 16 : for(i=0; i<5; ++i) { 17 :    printf(“ … %d, … %d",  a[i], *(p+i));  19 :  }  20 : 

  6. 95 88 76 54 85 82 배열과 포인터 • 배열의 원소를 몇 배로 만드는 함수 timesAry(int ary[], int times) 100번지 num • double aveAry( int ary[], int size); • void main() { • int num[] = {95, 88, 76, 54, 85}; • timesAry( num, 3 ); • for (i = 0; i < 5; i++) • printf(“%3d”, num[i]); • } • double timesAry( int ary[], int times) {  • for (i = 0; i < 5; i++) • ary[i] = ary[i] * times; • } int * ary ary *(ary+i) = *(ary+i) * times

  7. scanf() printf() 응용프로그램 (변수) 키보드 모니터 fscanf()를 사용하여 파일에서 읽어오기 fprintf()를 사용하여 파일에 쓰기 데이터파일 데이터파일 응용프로그램 (변수) read write 12장 파일 처리 • 콘솔을 이용한 입출력 • 파일을 이용한 입출력

  8. 순차적 파일 처리 • 파일(file) • 프로그램 파일 : 데이터를 처리할 명령어 집합 예) 성적처리프로그램, 도서관리프로그램 등 • 데이터 파일 : 프로그램에서 사용될 자료 집합(관련된 레코드들의 집합) 예) 학생들의 주소파일, 성적파일, 도서목록, 회원 정보 파일, 실험결과자료 등 • 파일 포인터 • 파일을 사용하려면 파일마다 파일 포인터가 지정되어야 함 • 파일 포인터 선언 FILE *파일포인터;

  9. 12.3 파일의 열기와 닫기 파일은 사용 전에 open하고 사용이 끝난 후에는 close하여야 함 1. 파일의 열기 파일포인터 = fopen(“파일명”, “파일접근방식”); • “파일접근방식” “w” : 프로그램에서 파일로 기록하기 “파일명”에 해당하는 파일이 존재하지 않는다면 이 이름의 파일이 새로 만들어지며, 이미 존재한다면 그 내용은 모두 사라진 후 새로 기록됨 “r” : 파일로 부터 프로그램으로 읽어오기 “a” : 추가용으로 파일의 끝에 새로운 내용을 추가 “파일명”에 해당하는 파일이 존재하지 않는다면 이 이름의 파일이 새로 만들어짐

  10. 12.3 파일의 열기와 닫기 파일이 제대로 열리지 않았다면 파일포인터에는 NULL이 저장된다. fp=fopen(“testfile.txt”, “r”); if (fp== NULL) printf(“그런 파일이 없습니다.”); else { … } 2. 파일의 닫기 fclose(파일포인터); 이후로 이 파일포인터는 재사용가능 즉, 새로 열리는 (다른)파일의 파일포인터로 사용가능

  11. 파일에 쓰기 : fprintf() fprintf(파일포인터, “출력양식”, 출력자료리스트); 여기의 내용이 차례로 출력양식에 맞게 파일포인터로 지정된 파일에 기록된다. • ① FILE * fp = fopen(“member.txt”, “w”); • no=1; • age=20; • ② fprintf(fp, “%3d %3d”, no, age); • fclose(fp); 사용자 작성 프로그램 member.txt ① 1 20 FILE * fp ② int no 1 int age 20

  12. 파일에 쓰기 예제 fprintf(파일포인터, “출력양식”, 출력자료리스트); • 학생의 번호, 이름, 평균을 “grade.txt”에 저장하기 int no=1; double ave=97.8; char name[7]=“홍길동”; FILE *fp; fp=fopen(“grade.txt”, “w”); fprintf(fp, "%2d %-10s %7.2lf \n", no, name, ave); fclose(fp); 주) 빈칸, ‘\t’, ‘\n’과 같은 데이터 구분자를 넣어줘야 다음에 이 파일에서 읽기를 할 때 데이터간 구분을 할 수 있다.

  13. 파일에 쓰기 예제 • 여러 명(SIZE)의 번호, 이름, 평균이 저장된 각각의 배열의 내용을 “stdArray.txt”에 저장하기 int no[SIZE]={1, 2, 3, 4, 5}; char name[SIZE][7]={“홍길동”,”성춘향”,“이몽룡”,“김갑돌”,“김갑순”}; double mean[SIZE] = {80.5, 93.5, 65.9, 88.7, 90.0}; fp=fopen(“stdArray.txt", “w"); for (i=0; i < SIZE; i++) fprintf(fp, "%2d %-10s %7.2lf \n", no[i],name[i],mean[i]); fclose(fp); • “a”로 하면 “stdArray.txt”파일의 끝에 새로 내용이 추가됨

  14. 파일에서 읽어 오기 : fscanf() fscanf(파일포인터, “입력양식”, 입력변수주소리스트); 여기의 내용이 차례로 출력양식에 맞게 파일포인터로 지정된 파일에 기록된다. • ① FILE * fp = fopen(“member.txt”, “r”); • fscanf(fp, “%d %d”, &no, &age); • printf(“번호:%d, 나이:%d\n”, no, age); • fclose(fp); 사용자 작성 프로그램 member.txt 모니터 ① 번호:1, 나이:20 1 20 FILE * fp ② int no 1  int age 20

  15. student.txt의 내용 1 홍길동 80.5 2 성춘향 93.5 3 이몽룡 65.9 4 김갑돌 88.7 5 김갑순 90.0 ^Z(파일의 끝) 파일에서 읽어오기 예제 1 / 노트 • “student.txt”로부터 학생의 자료를 읽어서 모니터에 표시하기 char name[7]; int no; double mean; FILE *fp; _________________________________ for (i=0 ; i < 5 ; i++) { _______________________________________ ; printf("%2d %-10s %7.2lf \n",no, name, mean); } fclose(fp); fp=fopen("student.txt", "r"); fscanf(fp, "%d %s %lf", &no, name, &mean); • 파일로부터 읽은 자료를 정렬하고자 한다면?no, name, mean은 for 문안에서 반복될 때마다 새로운 자료로 바뀌므로 모든 정보를 비교해가며 수행해야하는 정렬 작업을 할 수 없다. 그렇다면 어떻게?

  16. student.txt의 내용 1 홍길동 80.5 2 성춘향 93.5 3 이몽룡 65.9 4 김갑돌 88.7 5 김갑순 90.0 파일에서 읽어오기 예제 2 / 노트 • 파일로부터 읽은 자료를 성적순으로 정렬하고자 한다면?배열을 선언하고 파일의 내용을 배열에 저장한 후 정렬한다. 1. “student.txt”로부터 학생의 자료를 읽어서 배열에 저장하기 char name[SIZE][7]; int no[SIZE]; double mean[SIZE]; FILE *fp; fp=fopen("student.txt", "r"); for (i=0 ; i < SIZE ; i++) { fscanf(fp, "%d %s %lf", &no[i], name[i], &mean[i]); printf("%2d %-10s %7.2lf \n", no[i], name[i], mean[i]); } fclose(fp);  파일에 저장되어 있는 정보가 프로그램의 name, no, mean 배열에 모두 저장되어 있으므로 이 배열을 이용하여 원하는 처리를 할 수 있다.

  17. 파일에서 읽어오기 예제 2 / 노트 2. 정렬하기 for ( pass=1 ; pass < SIZE ; pass++) for (i=0 ; i < SIZE-pass ; i++) { if (mean[i]<mean[i+1]) { mean[i]와 mean[i+1]을 교환 name[i]와 name[i+1]도 교환 no[i]와 no[i+1]도 교환 } } 3. 출력하기 for (i=0 ; i < SIZE-pass ; i++) printf("%2d %-10s %7.2lf \n", no[i], name[i], mean[i]); no, name, mean 배열의 내용은 바뀌었지만 파일의 원본 내용은 그대로 있다.

More Related