C언어 총 정리 7 - 배열
배열은 여러 변수들이 같은 배열이름으로 일정한 크기의 연속된 메모리에 저장되는 구조이다.
배열을 구성하는 각각의 항목을 배열의 원소라 한다. 배열에서 가장 중요한 요소는 배열이름, 원소 자료유형, 배열크기이다.
배열선언
int data[10]; 같은 형태로 원소자료유형 배열이름[배열크기]; 로 선언한다.
배열 선언시 초기값 지정이 없다면 반드시 배열크기는 양의 정수로 명시한다.
배열의 크기를 지정하는 부분에는 양수 정수로 리터럴 상수와 매크로 상수 또는 이들의 연산식은 가능하지만 변수와 const 상수로는 배열의 크기를 지정할 수 없다.
배열 초기화
배열선언을 하면서 대입연산자를 이용하며 중괄호 사이에 여러 원소값을 쉼표로 구분하여 기술하는 방법이다.
int score[5] = {20,40,56,87,95};
double a[3]= {72.4, 65.8, 10.2};
베열크기는 생략 가능하며, 생략시 중괄호 사이에 기술된 원소 수가 배열크기가 된다.
이차원 배열 선언과 사용
이차원 배열은 테이블 형태의 구조를 나타낼 수 있으므로 행(row)과 열(column )의 구조로 표현할 수 있다.
#define ROWSIZE 5
#define COLSIZE 4
int point[ROWSIZE][COLSIZE];
이차원배열에서는 2개의 대괄호가 필요한데, 첫번째 대괄호에는 배열의 행 크기, 두 번째는 배열의 열 크기를 지정한다. 배열선언 시 초기값을 저장하지 않으면 반드시 행과 열의 크기는 명시되어야한다.
이차원 배열 초기화
이차원 배열을 선언하면서 초기값을 지정하는 방법
1.중괄호를 중첩되게 이용하는 방법
2.일차원 배열 같이 하나의 중괄호를 사용하는 방법
int point[2][3] = {{55, 37, 72},{24, 58, 97}};
int point[2][3] = {55, 37, 72,24, 58, 97};
int point[][3] = {55, 37, 72,24, 58, 97};
이차원 배열선언 초기값 지정에서도 첫 번쨰 대고라호 내부의 행의 크기는 명시하지 않을 수 있다. 그러나 두번째 댈괄호 내부의 열의 크기는 반드시 명시해야한다.
배열원소의 주소와 내용 값의 다양한 접근방법
배열초기화 문장 | int point[] = {52, 63, 78 }; | |||
배열 원소값 | 52 | 63 | 78 | |
배열원소 접근방법 | score[i] | score[0] | score[1] | score[2] |
*(score + i) | *score | *(score + 1) | *(score + 2) | |
주소값 접근방법 | &score[i] | &score[0] | &score[1] | &score[2] |
scroe + i | score | scroe + 1 | scroe + 2 | |
실제 주소값 | base + 원소크기 * i | 만약 3이면 | 6 = 3+1*3 | 9 = 3+2*3 |
이차원 배열과 포인터
이차원배열에서 배열이름인 td는 포인터 상수 td[0]를 가르키는 포인터 상수이다.
포인터 상수 td[0]는 배열의 첫 번째 원소 td[0][0]의 주소값 &td[0][0]을 갖는 포인터 상수이다.
배열이름인 td는 포인터의 포인터인 이중포인터이다. (td는 이중포인터이므로 간접연산자 *가 2개 필요하다.)
포인터 배열
포인터 배열이란 주소값을 저장하는 포인터를 배열 원소로 하는 배열이다.
int *pary[3] = {NULL}; //NULL 주소를 하나 지정하면 나머지 모든 배열원소에 NULL주소가 지정된다.
int i, x = 15, y = 25, z =35;
pary[0] = &x; pary[1] = &y; pary[2] = &z;
배열 포인터
일차원 배열 포인터 변수 선언
int a[] = {8, 2, 8, 1, 3};
int *p = a;
이차원 배열 포인터 변수 선언
int ary[][4] = {5, 7, 6, 2, 7, 8, 4, 3};
int (*ary)[4] = ary;
//int *ptr[4] = ary; //포인터배열
주의 할점은 선언문장 int (*ptr)[4];에서 괄호 (*ptr)은 반드시 필요하다.