570 likes | 876 Views
[ 배열과 문자열 ]. [ 목차 ]. 1 차원 배열 문자열의 사용 문자열 처리 함수 다차원 배열 배열 초기화 문자열 배열 3 차원 배열 간단한 알고리즘 이해하기. 1 차원 배열. 1 차원 배열. 배열 (array) : 하나의 이름으로 참조되는 같은 자료형을 갖은 메모리의 연속적인 공간
E N D
[목차] • 1차원 배열 • 문자열의 사용 • 문자열 처리 함수 • 다차원 배열 • 배열 초기화 • 문자열 배열 • 3차원 배열 • 간단한 알고리즘 이해하기
1차원 배열 • 배열(array) : 하나의 이름으로 참조되는 같은 자료형을 갖은 메모리의 연속적인 공간 • 배열 사용의 이유 : 변수란 임의의 값을 담아 프로그램에서 사용하기 위한 목적으로 사용된다. 그러나 하나의 프로그램에서 너무 많은 변수를 사용하다 보면 변수 이름을 일일이 기억하여 사용한다는 것에 한계를 느끼게 된다.
int a , b, c, d, e, f, … ; // 변수선언문 • 이런 식으로 여러 개의 변수를 선언하게 되면, 그 값들을 사용하게 위한 변수를 접근하는 데도 어려움을 느낄 수 밖에 없다. 그에 비해, 배열은 하나의 이름으로 다량의 데이터를 관리 할 수 있다는 점에 그 의의가 있다. • int a[200]; // 200개의 변수를 만든다.
배열 : 자료형(type)이 모두 같고, 하나의 이름으로 참조되는 변수들의 집합이다. 배열은 선언되면 원소의 수 만큼 메모리에 할당을 받게 되는데 배열 내에 있는 각 원소를 배열 원소라 부른다. 또한 배열원소는 원소의 번호를 index(색인)으로 사용하여 참조된다. • 1차원 배열 type 변수명[size]; • 2차원 배열 type 변수명[행][열]; • 3차원 배열 type 변수명[면][행][열];
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
배열의 선언과 메모리 할당 • 배열을 연속된 기억장소에 할당하게 된다. • 특정 index를 주어 해당 원소의 위치에 값을 대입할 수 있다. 배열 변수명 뒤에 index를 주어 몇 번째 위치인지 반드시 지정해야 한다. 이때 배열의 첫 번째 원소의 시작은 0이다. • Array1.c
배열을 선언과 동시에 초기화 Int num[5] = {10, 20, 30, 40, 50}; C언어에서 배열 변수명은 배열의 데이터를 갖는 것이 아니라, 그 배열이 시작하는 메모리의 선두번지를 갖는 포인터이다.
printf(“num : %p\n”, num); • 배열 변수명은 그 배열의 선두 주소를 갖는다. 그것을 포인터 상수라고도 한다. • & : 주소 연산자.
배열에서 안 되는 것 • y=10; • x=y; • int a[10],b[10]; • a=b[x]; 식의 문장은 성립하지 않는다. • a[0]=b[0]; • : : • a[9]=b[9];
정렬 • 정렬 : 정렬을 시키고 저장된 내용을 검색. • 버블정렬 • 내림차순 : 큰 것부터 정렬 • 오름차순 : 작은 것부터 정렬
문자 배열 • 1차원 문자 배열을 사용하여 문자열을 지원한다. 문자열은 null 종료 문자 배열로 정의한다. C에서는 null은 0이다. 문자열이 null로 종료된다는 사실은 문자열을 저장할 배열의 크기가 가장 긴 문자열의 크기보다 1 byte (null 문자를 위한 공간) 더 커야 한다는 의미이다.
문자배열 • char arr[10]; //문자 배열 선언 • char arr[10] = {‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’}; • //문자 상수 초기화 • char arr[10]=“string”; //문자열 초기화
1.1 변수 선언의 의미 • 변수를 선언하면 컴파일러는 변수를 저장하기 위해 사용하지 않은 메모리의 위치를 찾고 그 주소로부터 변수의 데이터형 크기만큼 메모리를 확보하게 된다. 또 프로그램에서 변수에 어떠한 값을 할당하면 확보된 메모리에 그 값을 저장하게 된다. • 컴파일러가 프로그램을 컴파일할 때 프로그램에서 사용된 변수의 정보-변수 이름, 시작주소, 데이터(크기)들을 포함한 변수 테이블을 만들어 관리하게 된다. 그러므로 변수 테이블에서 변수를 찾아 테이블에 저장된 변수에 대한 정보를 이용하게 되는 것이다.
1.2 포인터의 의미 • 포인터 변수: 메모리의 주소 값만을 저장하는 변수. 주소에 대한 기호화된 표현 • 포인터의 기능 • 배열의 요소를 다룰 수 있다. • 함수의 인수로 사용되어 데이터를 변경할 수 있다. • 메모리를 동적으로 할당할 수 있다. • 함수 호출을 동적으로 할 수 있다.
1.3 포인터 변수의 선언 • 데이터형 * 포인터 변수명, *포인터변수명… ; • * : 변수를 포인터로 정의하는 간접 연산자 • int *pi; • & : 주소 연산자. 단항 연산자. 어떠한 대상체의 앞에 붙어서 그 대상체의 주소를 나타내고, 포인터의 초기화 때 사용한다.
1.4 포인터 변수의 초기화 • ․ 포인터 선언과 동시에 초기화 데이터형 *포인터 변수명 = &변수명; • ․ 포인터 선언 후 대입문을 이용하여 초기화 포인터 변수명 = &변수명;
int j = 100; • char c='A'; • float f = 100.21; • int *pi=&j; • char *pc=&c; • float *pf=&f;
1.5 포인터 사용시 주의할 점 • c에서는 어떠한 변수의 주소 값을 아무 포인터에 무작정 대입하는 것은 최대한 피해주어야 한다. • 포인터는 항상 기억 장소를 가리키고 있어야 한다.
2.1 포인터에 정수를 더하거나 빼기 • 현재 포인터 변수 p가 주소 1000을 가리키고 있다고 가정 • p+1, 즉 포인터 변수 p에 정수 1을 더하면 결과값은 포인터 변수의 데이터형에 따라 달라진다. 즉, 포인터 변수에 정수를 더할 때에는 주소 + 정수가 아니라 다음과 같이 실제 주소를 구하게 된다. • 실제 주소 = 포인터가 가리키는 주소 + 정수 * 포인터 변수 데이터형 크기
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)바이트)
․ px가 int형 포인터일 때 • ․ px가 double형 포인터일 때 • ․ px가 배열의 첫 요소를 가리키고 있을 때 : px+i는 배열의 i번째 요소를 가리킨다. • ․ px가 배열의 어떤 요소를 가리키고 있을 때 : px-i는 그 요소의 I번째 앞에 있는 요소를 가리킨다. • ․ px가 int형 포인터일 때 : px+i는 그 요소의 I번째 뒤에 있는 요소를 가리키게 된다.
3.2 *(px + ⅰ), px[ⅰ] • *(px + ⅰ)의 의미 : 이는 배열 x의 I번째 요소의 내용을 읽어내는 것이다. • px[ⅰ]의 의미 : *(px + ⅰ)와 동일한 수식으로 정의되어 있다.
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는 증가되지 않는다. )
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);
3.4.2실행결과 • px=x • py=x+4 • Rel_position == 4 element • Rel_address == 8 byte • Mid = high +(high-low)/2; • “포인터+정수 수치” 연산은 문법상 아무런 문제가 없다.
3.5.1 포인터와 같이 쓸 수 있는 연산자 • 포인터에 직접 쓸 수 없는 연산자. • 포인터와 쓸 수 있는 연산자의 예 ▪ 관계 연산자 == != < <= > >=
3.5.2 포인터와 같이 쓸 수 있는 연산자 • 적법한 포인터 연산(void pointer operation) ▪ 포인터를 동일한 형의 포인터에 대입하는 연산 ▪ 포인터에서 정수 수식을 더하거나 빼는 연산 ▪ 동일한 하나의 배열의 서로 다른 두 배열 요소를 각각 가리키고 있는 두 포인터를 비교하거나 그 차를 구하는 연산 ▪ 정수수치 0, 즉 널 포인터를 대입하거나 널 포인터와 비교하는 연산
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;
1.1 배열의 배열과 부분 배열 • 다차원 배열: 배열의 배열, 또 이 말은 배열요소가 배열이라는 의미를 가지고 있다. • 이때 그 배열 요소로서의 배열을 부분 배열이라고 한다. 그래서 다차원 배열은 ‘배열 요소가 부분 배열인 배열’이라고 할 수 있다.
3*2 배열 y [0][0] [0][1] [1][0][1][1] [2][0] [2][1] 부분 배열 y[0]부분 배열 y[1]부분 배열 y[2]
1.1 포인터 배열 • 포인터 배열 : 배열의 각 요소가 포인터를 나타내는 것. • 형식 ▪ 데이터형 *배열 이름[요소의 개수]; int a[3][5]; int *a[3];]
#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]); • }
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(); • }
Q. 배열포인터와 포인터배열의 차이 • int *arr[]; // 포인터배열 • int (*arr)[]; //배열포인터 • 배열 int temp[10], temp1[20]; • 포인터 배열 : • int *arr[]={temp. temp1}; • 배열 포인터 : • int (*arr)[10]=&temp;
2.1 포인터 변수의 포인터 • 형식 : 데이터형 **변수명; • Ex) char **p; • 포인터의 포인터 : 포인터 데이터를 가르키는 포인터 • char *po; ▪ po는 문자형 데이터가 있는 메모리. • char **p; ▪ 문자형 데이터가 있는 메모리를 가르키는 변수가 있는 메모리를 가르키는 변수