08_week09

Views:
 
Category: Entertainment
     
 

Presentation Description

No description available.

Comments

Presentation Transcript

C Programming : 

C Programming 08. 배열과 포인터 Korea Aviation Polytechnic College

Slide 2: 

학습목표 배열의 선언과 초기화를 살펴본다. 다차원 배열 구조와 주소 개념을 살펴본다. 다차원 배열을 포인터로 접근하기 위한 배열포인터에 대해 살펴본다.

Slide 3: 

1.1 1차원 배열 선언 배열은 자료형이 모두 같고, 하나의 이름으로 참조되는 변수들의 집합이다. 1차원 배열(one-dimensional array)은 배열 변수명 뒤에 대괄호가 하나 선언된 구조를 말한다. 이때 대괄호[] 안의 값은 그 배열이 가질 원소의 수로 배열의 크기가 된다. 형식 ) type var-name[size];

Slide 4: 

1.1 1차원 배열의 선언 메모리 할당 배열은 연속된 기억장소에 할당하게 된다. 가장 첫 번째 원소의 내용을 가장 적은 주소로부터 시작하여 차례대로 할당하게 된다. 배열 원소는 원소의 번호를 첨자(subscript) 또는 색인(index)을 사용하여 참조된다. C에서 모든 배열은 0으로 시작한다. 이것은 배열에서 첫 번째 원소를 접근하기 위해서는 색인으로 0을 사용해야 한다는 것을 의미한다.

Slide 5: 

1.2 1차원 배열 요소에 접근하기 C 언어에서 배열 변수명은 배열이 시작하는 메모리의 시작번지를 갖는 포인터이다. 배열 원소를 제어하기 위해 배열명에 첨자(index)를 붙여 배열의 원소를 접근한다. 배열이 할당된 메모리의 주소를 확인하기 위해 주소연산자 “&”를 사용할 수 있다. 배열을 초기화 할 때 초기화 상수의 수가 배열 요소보다 적을 때 초기화되지 않은 공간은 문자배열은 ‘\0’(null 바이트) , 정수형 배열은 0으로 초기화 된다. 그러나 이 값은 ASCII CODE를 확인해 보면 같은 값을 의미한다.

Slide 6: 

1.2 1차원 배열 예제 8_1.c

Slide 7: 

1.2 1차원 배열 예제  첨자가 없는 배열변수의 크기는 배열이 메모리에 할당된 배열 전체의 크기이며, 첨자가 있는 배열의 크기는 그 원소가 메모리에 할당된 크기 이다.  결과

Slide 8: 

다차원 배열(Multidimensional Array)은 배열의 요소 자체가 또 다른 배열이 되는 경우(Array of Array)를 말한다. 2차원 배열은 행렬을 표현하기 위해 가장 많이 쓰이며, 실제로 2차원 배열의 크기는 [행크기][열크기]로 선언한다. 1.3 2차원 배열 선언 형식 ) type var-name[row-size][column-size];

Slide 9: 

2차원 배열의 논리적인 구조 2차원 배열은 1차원 배열의 배열이다. 따라서 1차원 배열구조가 아래방향으로 여러 개 나열되는 구조라 생각할 수 있다. 즉 테이블 형식으로 자료를 표현하고자 할 때 2차원 배열구조를 활용할 수 있다. 1.3 2차원 배열

Slide 10: 

1.3 2차원 배열 2차원 배열의 물리적인 구조(메모리에 할당된 구조) 배열은 언제나 연속된 메모리 할당을 보장받는다. 따라서 물리적으로 메모리 할당된 공간은 1차원 배열의 연속된 공간이다.

Slide 11: 

1.4 2차원 배열요소에 접근하기 2차원 배열은 배열의 행을 접근하고, 그 행에서 열의 위치를 접근해야 한다. 따라서 2차원 배열의 원소에 접근할 때에는 첨자를 두 개 사용해야 한다. 8_2.c

Slide 12: 

1.4 2차원 배열요소에 접근하기 문자배열 names[3][5]은 문자열을 출력하므로 행의 시작주소를 출력하게 되면 행의 문자열 끝까지 출력한다.  결과

Slide 13: 

2. 배열 초기화 배열은 선언과 동시에 초기화 값을 부여할 수 있다. 배열은 선언하고 초기화하지 않으면 배열이 스택에 할당된다면 쓰레기(Garbage) 값을 갖는다. 초기화 값은 배열 메모리 내에 순서대로 저장된다. 다음은 초기화를 하는 여러 가지 방식을 나타낸 것이다. char name[5]=”king”; //1차원 문자배열 초기화 char score[5]={10,20,30,40,50}; //1차원 정수배열 초기화 char names[3][5]={"sun","park","kim"}; //2차원 문자배열 초기화 int score[3][5]= {{10,20,30,40,50},{60,70,80,90,100}, {110,120,130,140,150}}; //2차원 문자배열 초기화 배열을 초기화할 때 할당된 나머지 영역은 항상 0을 보장 받는다.

Slide 14: 

2. 언사이즈드 배열(Unsized Array) 이란 ? 배열을 초기화 할 때는 배열의 크기를 지정할 필요가 없다. 즉 대괄호 안이 비워있어도 된다. 크기를 지정하지 않으며, 컴파일러는 초기화 상수의 개수를 세어 그 개수를 배열의 크기로 사용한다. 크기가 지정되지 않은 배열을 언사이즈드 배열(unsized array)이라고 한다. 예) int score[]={10,20,30,40,50}; char name[]=”king“; int score[][3]={ 10, 20, 30, 40, 50, 60 }; 다차원 배열에서는 가장 왼쪽 차원만 크기를 지정하지 않으며 나머지 차원은 모두 지정되어야 한다.

Slide 15: 

3. 배열의 주소개념 첨자가 없는 배열 변수명은 그 배열이 시작되는 메모리의 시작번지를 갖는 포인터 상수이다. 2차원 배열에서 포인터 상수는 배열 변수명 뿐만 아니라 배열의 행도 주소이다. 2차원 배열 선언 예) score[3][5]={10,20,30,40,50,60,70,80,90,100,110,120,130,140,150}; score : 배열의 시작번지를 갖는 포인터 상수 score[0] : socre 배열의 0행의 시작번지를 갖는 포인터 상수 score[0][0] : socre 배열의 0행, 0열인 원소의 값 &score[0][0] : socre 배열의 0행, 0열의 시작주소 char names[3][5] ={"sun","park","kim"};

Slide 16: 

3. 2차원 배열 메모리 할당

Slide 17: 

3. 2차원 배열 행 주소 확인 8_3.c  결과

Slide 18: 

4.1 1차원 배열과 포인터 배열은 포인터와 밀접한 관계를 가지며 포인터 변수를 이용하여 배열을 제어하는 것이 매우 일반적인 방법이다. int score[5]={10,20,30,40}, *ptr ; ptr=score ; //배열 변수명은 배열이 할당된 메모리의 시작주소 즉, score == &score[0] == ptr은 같은 주소를 갖게 된다.

Slide 19: 

4.1 1차원 배열을 포인터변수로 접근 8_4.c

Slide 20: 

4.1 1차원 배열을 포인터변수로 접근 score[1]과 *(score+1)은 같은 내용임을 알 수 있다. 즉 배열 첨자가 포인터 식으로 접근될 수 있으며 규칙은 다음과 같다. 따라서 다음 식은 같다. *( score +i) = *( ptr +i) = score [i] = ptr[i] // 배열의 i+1번째 위치의 데이터 score+i = ptr+i = & score [i] = &ptr[i] // 배열의 i+1번째 위치의 주소  결과

Slide 21: 

4.2 2차원 배열과 포인터 다음과 같이 선언된 2차원 배열과 포인터 변수의 관계 를 보자. int score[3][5]={10,20,30,40,50,60,70,80,90,100,110,120,130,140,150}; int *ptr1; ptr1=&score[0][0]; // 첫 번째 원소의 시작주소 즉, score == score[0] == score[0][0] == ptr1은 같은 주소를 갖게 된다.

Slide 22: 

8_5.c

Slide 23: 

4.2 2차원배열을 포인터변수로 접근하기 포인터 변수 ptr1은 score 배열의 첫 번째 원소를 가리키고 있고, *ptr1++를 이용하여 주소를 증가하면서, 두 번째, 세 번째 원소들을 차례대로 가리킨다.  결과

Slide 24: 

5. 2차원 배열 포인터 다루기 배열 포인터란 다차원 배열의 시작 주소를 저장하여 데이터로 사용하는 포인터 변수를 의미한다. 포인터 변수는 선언에 따라 저장하는 주소의 대상이 달라진다. 배열 포인터 선언 형식) 자료형 (* 배열포인터변수) [배열크기]; int * ptr1; // 포인터 변수 // 변수의 시작주소나, 1차원배열의 시작주소를 저장할 수 있다. int (* ptr2)[3]; // 2차원 배열 포인터변수 //[ 3]열을 갖는 2차원 정수형 배열의 시작주소를 저장할 수 있다. int (* ptr3)[3][4]; // 3차원 배열 포인터변수 // [3]행[4]열을 갖는 3차원 정수형 배열의 시작주소를 저장할 수 있다.

Slide 25: 

5. 2차원 배열 포인터 메모리 할당 선언문으로 생성되는 변수는 일반 포인터 변수처럼 4바이트를 할당된다. 따라서 배열이 몇 차원이냐에 따라 배열 포인터 변수의 선언이 달라지며, 선언의 형태에 따라 배열을 가리키는 대상체가 달라진다.

Slide 26: 

5.2 2차원 배열포인터 활용 8_6.c  결과 배열의 시작주소를 배열포인터 ptr2에 할당한 후 배열포인터를 1씩 증가시키며 주소의 연산결과를 출력하고 있다. 결과를 보면 배열포인터 변수의 증가가 정수 4Byte를 증가하는 것이 아닌 배열포인터에 선언된 열수 5에 정수형 크기를 곱한 크기 즉 20 바이트가 증가되는 것을 알 수 있다. 주소를 쉽게 이해하기 위해 10진수 출력을 함께 하였다.

Slide 27: 

5.2 배열포인터를 이용한 배열 출력 8_7.c

Slide 28: 

5.2 배열포인터를 이용한 배열 출력 2차원 배열의 시작번지를 ptr2가 할당 받았기 때문에 배열을 이용하는 것처럼 첨자를 이용한 접근이 가능해진다. 또한 ptr2를 이용한 포인터 연산을 통하여 배열 원소에 접근할 수 있다. 첨자를 연산식으로 변경하려면 안쪽의 대괄호부터 식으로 변환한다. ① ptr2[i][j] : *(ptr2 + i) [j] //안쪽 [i] 변환 식 ② *( *(ptr2 + i) +j ) //바같쪽 [j] 변환 식  결과

Slide 29: 

요약 배열 초기화를 이해하며 다음과 같은 표준 라이브러리 함수를 이용하여 배열초기화나 배열을 복사할 수 있다. memset() : 메모리 초기화 함수 (주로 메모리를 0으로 초기화할 때 사용) memmove() : 메모리 복사 함수 (메모리를 다른 영역으로 복사할 때 사용) 배열의 시작주소를 포인터 변수에 저장하면 포인터를 이용하여 배열의 항목에 접근 할 수 있다. 다차원 배열을 포인터 변수가 접근하기 위해 n차원 배열의 시작주소를 저장할 수 있는 배열포인터를 선언할 수 있다. int (*ptr)[5]; //[3]열을 갖는 2차원 정수형 배열포인터 선언이다.

authorStream Live Help