1 / 57

[ 배열과 문자열 ]

[ 배열과 문자열 ]. [ 목차 ]. 1 차원 배열 문자열의 사용 문자열 처리 함수 다차원 배열 배열 초기화 문자열 배열 3 차원 배열 간단한 알고리즘 이해하기. 1 차원 배열. 1 차원 배열. 배열 (array) : 하나의 이름으로 참조되는 같은 자료형을 갖은 메모리의 연속적인 공간

murray
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. [배열과 문자열]

  2. [목차] • 1차원 배열 • 문자열의 사용 • 문자열 처리 함수 • 다차원 배열 • 배열 초기화 • 문자열 배열 • 3차원 배열 • 간단한 알고리즘 이해하기

  3. 1차원 배열

  4. 1차원 배열 • 배열(array) : 하나의 이름으로 참조되는 같은 자료형을 갖은 메모리의 연속적인 공간 • 배열 사용의 이유 : 변수란 임의의 값을 담아 프로그램에서 사용하기 위한 목적으로 사용된다. 그러나 하나의 프로그램에서 너무 많은 변수를 사용하다 보면 변수 이름을 일일이 기억하여 사용한다는 것에 한계를 느끼게 된다.

  5. int a , b, c, d, e, f, … ; // 변수선언문 • 이런 식으로 여러 개의 변수를 선언하게 되면, 그 값들을 사용하게 위한 변수를 접근하는 데도 어려움을 느낄 수 밖에 없다. 그에 비해, 배열은 하나의 이름으로 다량의 데이터를 관리 할 수 있다는 점에 그 의의가 있다. • int a[200]; // 200개의 변수를 만든다.

  6. 배열 : 자료형(type)이 모두 같고, 하나의 이름으로 참조되는 변수들의 집합이다. 배열은 선언되면 원소의 수 만큼 메모리에 할당을 받게 되는데 배열 내에 있는 각 원소를 배열 원소라 부른다. 또한 배열원소는 원소의 번호를 index(색인)으로 사용하여 참조된다. • 1차원 배열 type 변수명[size]; • 2차원 배열 type 변수명[행][열]; • 3차원 배열 type 변수명[면][행][열];

  7. Count라는 배열에 10개의 정수를 입력하기. #include<stdio.h> int main(void){ int count[10]; int I; for(i=0; i<10; i++){ scanf(“%d”, &count[i]);} } return 0; } - ex1-1) 위의 예제에 대한 설명을 쓰고, ex1-2) 프로그래밍 예제 작성하시오. ex1-2) 키보드로 5개의 정수를 읽어들여 배열에 저장하고, 입력된 값의 제곱값을 차례로 출력시키는 프로그램을 작성하시오. Ex1) array_count.c

  8. 배열의 선언과 메모리 할당 • 배열을 연속된 기억장소에 할당하게 된다. • 특정 index를 주어 해당 원소의 위치에 값을 대입할 수 있다. 배열 변수명 뒤에 index를 주어 몇 번째 위치인지 반드시 지정해야 한다. 이때 배열의 첫 번째 원소의 시작은 0이다. • Array1.c

  9. 배열을 선언과 동시에 초기화 Int num[5] = {10, 20, 30, 40, 50}; C언어에서 배열 변수명은 배열의 데이터를 갖는 것이 아니라, 그 배열이 시작하는 메모리의 선두번지를 갖는 포인터이다.

  10. printf(“num : %p\n”, num); • 배열 변수명은 그 배열의 선두 주소를 갖는다. 그것을 포인터 상수라고도 한다. • & : 주소 연산자.

  11. 배열에서 안 되는 것 • y=10; • x=y; • int a[10],b[10]; • a=b[x]; 식의 문장은 성립하지 않는다. • a[0]=b[0]; • : : • a[9]=b[9];

  12. 정렬 • 정렬 : 정렬을 시키고 저장된 내용을 검색. • 버블정렬 • 내림차순 : 큰 것부터 정렬 • 오름차순 : 작은 것부터 정렬

  13. 문자열의 사용

  14. 문자 배열 • 1차원 문자 배열을 사용하여 문자열을 지원한다. 문자열은 null 종료 문자 배열로 정의한다. C에서는 null은 0이다. 문자열이 null로 종료된다는 사실은 문자열을 저장할 배열의 크기가 가장 긴 문자열의 크기보다 1 byte (null 문자를 위한 공간) 더 커야 한다는 의미이다.

  15. 문자배열 • char arr[10]; //문자 배열 선언 • char arr[10] = {‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’}; • //문자 상수 초기화 • char arr[10]=“string”; //문자열 초기화

  16. 문자열 입출력 함수

  17. [포인터(pointer)]

  18. 1. 포인터의 개념

  19. 1.1 변수 선언의 의미 • 변수를 선언하면 컴파일러는 변수를 저장하기 위해 사용하지 않은 메모리의 위치를 찾고 그 주소로부터 변수의 데이터형 크기만큼 메모리를 확보하게 된다. 또 프로그램에서 변수에 어떠한 값을 할당하면 확보된 메모리에 그 값을 저장하게 된다. • 컴파일러가 프로그램을 컴파일할 때 프로그램에서 사용된 변수의 정보-변수 이름, 시작주소, 데이터(크기)들을 포함한 변수 테이블을 만들어 관리하게 된다. 그러므로 변수 테이블에서 변수를 찾아 테이블에 저장된 변수에 대한 정보를 이용하게 되는 것이다.

  20. 1.2 포인터의 의미 • 포인터 변수: 메모리의 주소 값만을 저장하는 변수. 주소에 대한 기호화된 표현 • 포인터의 기능 • 배열의 요소를 다룰 수 있다. • 함수의 인수로 사용되어 데이터를 변경할 수 있다. • 메모리를 동적으로 할당할 수 있다. • 함수 호출을 동적으로 할 수 있다.

  21. 1.3 포인터 변수의 선언 • 데이터형 * 포인터 변수명, *포인터변수명… ; • * : 변수를 포인터로 정의하는 간접 연산자 • int *pi; • & : 주소 연산자. 단항 연산자. 어떠한 대상체의 앞에 붙어서 그 대상체의 주소를 나타내고, 포인터의 초기화 때 사용한다.

  22. 1.4 포인터 변수의 초기화 • ․ 포인터 선언과 동시에 초기화 데이터형 *포인터 변수명 = &변수명; • ․ 포인터 선언 후 대입문을 이용하여 초기화 포인터 변수명 = &변수명;

  23. int j = 100; • char c='A'; • float f = 100.21; • int *pi=&j; • char *pc=&c; • float *pf=&f;

  24. 1.5 포인터 사용시 주의할 점 • c에서는 어떠한 변수의 주소 값을 아무 포인터에 무작정 대입하는 것은 최대한 피해주어야 한다. • 포인터는 항상 기억 장소를 가리키고 있어야 한다.

  25. 2. 포인터 연산

  26. 2.1 포인터에 정수를 더하거나 빼기 • 현재 포인터 변수 p가 주소 1000을 가리키고 있다고 가정 • p+1, 즉 포인터 변수 p에 정수 1을 더하면 결과값은 포인터 변수의 데이터형에 따라 달라진다. 즉, 포인터 변수에 정수를 더할 때에는 주소 + 정수가 아니라 다음과 같이 실제 주소를 구하게 된다. • 실제 주소 = 포인터가 가리키는 주소 + 정수 * 포인터 변수 데이터형 크기

  27. 3. 일차원 배열 포인터와 포인터 연산

  28. 3.1 px + ⅰ의 의미 • int x[5], *px; px=x; • px+1; 의 의미 : px 바로 다음에 있는 바이트의 번지를 가리키는 것이다. • 만약 px가 int형 포인터라 하면, int형은 메모리에서 2바이트 크기를 가지게 되므로, px+1은 px+(2바이트)의 번지를 가리키게 되는 것이다. • px+i가 가리키는 번지 : px+(i * sizeof(*ps)바이트)

  29. ․ px가 int형 포인터일 때 • ․ px가 double형 포인터일 때 • ․ px가 배열의 첫 요소를 가리키고 있을 때 : px+i는 배열의 i번째 요소를 가리킨다. • ․ px가 배열의 어떤 요소를 가리키고 있을 때 : px-i는 그 요소의 I번째 앞에 있는 요소를 가리킨다. • ․ px가 int형 포인터일 때 : px+i는 그 요소의 I번째 뒤에 있는 요소를 가리키게 된다.

  30. 3.2 *(px + ⅰ), px[ⅰ] • *(px + ⅰ)의 의미 : 이는 배열 x의 I번째 요소의 내용을 읽어내는 것이다. • px[ⅰ]의 의미 : *(px + ⅰ)와 동일한 수식으로 정의되어 있다.

  31. 3.3 *px++, (*px)++, *++px, ++*px의 차이 • *px++ : (연산순위) *(px++)와 동일하다. *px값을 구하고 난 후, px를 1만큼 증가시켜 놓는다. • (*px)++ : 먼저 *px를 구한 후, *px값 자체를 1만큼 증가시킨다. (단, px는 증가되지 않는다) • *++px : *(++px)와 동일하다. 먼저 px를 1만큼 증가시킨 후, *px를 구한다. • ++*px : ++(*px)와 동일하다. *px 값 자체를 1만큼 증가시킨다. (단, px는 증가되지 않는다. )

  32. 3.4.1 포인터에 포인터 더하기 int x[5], *px, *py; int rel_position, rel_address; px=x; py=x+4; printf("px=x\n py = x+4\n");          rel_position = py-px; rel_address = rel_position+sizeof(*px);          printf("rel position == %d element\n", rel_position); printf("rel address == %d byte\n", rel_address);

  33. 3.4.2실행결과 • px=x • py=x+4 • Rel_position == 4 element • Rel_address == 8 byte • Mid = high +(high-low)/2; • “포인터+정수 수치” 연산은 문법상 아무런 문제가 없다.

  34. 3.5.1 포인터와 같이 쓸 수 있는 연산자 • 포인터에 직접 쓸 수 없는 연산자. • 포인터와 쓸 수 있는 연산자의 예 ▪ 관계 연산자 == != < <= > >=

  35. 3.5.2 포인터와 같이 쓸 수 있는 연산자 • 적법한 포인터 연산(void pointer operation) ▪ 포인터를 동일한 형의 포인터에 대입하는 연산 ▪ 포인터에서 정수 수식을 더하거나 빼는 연산 ▪ 동일한 하나의 배열의 서로 다른 두 배열 요소를 각각 가리키고 있는 두 포인터를 비교하거나 그 차를 구하는 연산 ▪ 정수수치 0, 즉 널 포인터를 대입하거나 널 포인터와 비교하는 연산

  36. [다차원 배열 포인터]

  37. int x[3];// 일차원 배열의 정의 • int y[3][2];// 이차원 배열의 정의 • int x[3][2][2]; // 삼차원 배열의 정의 • int *px;// 일차원 배열 포인터의 정의 • int (*px)[2];// 이차원 배열 포인터의 정의 • int (*px)[2][2];// 삼차원 배열 포인터의 정의 • px=x; py=y; px=z;

  38. 다차원 배열포인터의 개요

  39. 1.1 배열의 배열과 부분 배열 • 다차원 배열: 배열의 배열, 또 이 말은 배열요소가 배열이라는 의미를 가지고 있다. • 이때 그 배열 요소로서의 배열을 부분 배열이라고 한다. 그래서 다차원 배열은 ‘배열 요소가 부분 배열인 배열’이라고 할 수 있다.

  40. 3*2 배열 y [0][0] [0][1] [1][0][1][1] [2][0] [2][1] 부분 배열 y[0]부분 배열 y[1]부분 배열 y[2]

  41. [포인터 배열]

  42. 1. 포인터 배열

  43. 1.1 포인터 배열 • 포인터 배열 : 배열의 각 요소가 포인터를 나타내는 것. • 형식 ▪ 데이터형 *배열 이름[요소의 개수]; int a[3][5]; int *a[3];]

  44. #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]); • }

  45. 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"); printf("************************************************\n"); • getch(); • exit(0); • } • s=DayName(n); • printf(" %d'th dayname => %s\n\n", n,s); • getch(); • }

  46. Q. 배열포인터와 포인터배열의 차이 • int *arr[]; // 포인터배열 • int (*arr)[]; //배열포인터 • 배열 int temp[10], temp1[20]; • 포인터 배열 : • int *arr[]={temp. temp1}; • 배열 포인터 : • int (*arr)[10]=&temp;

  47. 2. 포인터의 포인터

  48. 2.1 포인터 변수의 포인터 • 형식 : 데이터형 **변수명; • Ex) char **p; • 포인터의 포인터 : 포인터 데이터를 가르키는 포인터 • char *po; ▪ po는 문자형 데이터가 있는 메모리. • char **p; ▪ 문자형 데이터가 있는 메모리를 가르키는 변수가 있는 메모리를 가르키는 변수

More Related