C 프로그래밍/C언어 정리

C언어 총 정리 7 - 배열

열곰탱 2021. 8. 8. 14:21

배열은 여러 변수들이 같은 배열이름으로 일정한 크기의 연속된 메모리에 저장되는 구조이다.

배열을 구성하는 각각의 항목을 배열의 원소라 한다. 배열에서 가장 중요한 요소는 배열이름, 원소 자료유형, 배열크기이다.

 

배열선언

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)은 반드시 필요하다.