카테고리 없음

8강 배열과 포인터

meta-tony 2023. 4. 11. 22:13

1.배열의 개념
일관성 있고 효율적인 새로운 변수 필요
- 하나의 변수 이름에 순서에 의한 번호 부여
배열의 정의
-동일한 자료형을 갖는 자료들의 리스트
-각 요소는 하나의 변수로 취급
- 배열명과 첨자로 구분

배열의 선언 형태
-1, 2, 3차원 배열(첨자의 갯수)

1차원 배열
- 배열의 첨자가 하나만 있는 배열
-첨자의 개수는 배열 전체의 구성요소의 개수를 의미
-배열의 각 요소는 배열명과 첨자로 구분
-첨자는 0부터 시작
-배열의 각 요소는 배열명과 첨자로 구분
-자료형과 기억 클래스는 갖는다.

1차원 배열 선언
형식: 자료형 배열명[개수]

1차원 배열의 기억공간 표현
물리적 표현 
기억장치에 각각 공간을 차지함
-array(배열명) 배열영역의 시작주소

1차원 배열의 초기화
-배열을 선언하면 기억공간을 초기화 해야 함
초기화 방법
1) 배열선언 후 초기값 할당
int array[4]; -> 반드시 배열의 값 할당
int array[4] = {10, 20, 30, 40};
int array[] = {10, 20, 30, 40};
int array[4] = {10, , 30, 40}; => error
int array[4] = {10, 20, 30, 40, 50} => error

외부로부터 자료를 입력 받아 초기화
int x[10]
for(i=0; i<10; i++)
{
scanf("%d", &c[i]); 
// scanf()함수를 이용하여 키보드를 통해 자료를 입력받음
}

1차원 배열의 초기화 후 기억공간의 표현
int array[5] = {10, 20, 30, 40, 50};

//1차원 배열의 사용 예1
#include <stdio.h>
void main() {
//1차원배열 선언과 초기화
int array1[4] = { 10, 20, 30, 40 };
int array2[] = { 10, 20, 30, 40 };
int array3[4] = { 10, 20 };
int array4[4] = { 0 };
int i;
for (i = 0; i <= 3; i++)
printf("array1[%d] = %d \t", i, array1[i]);
for (i = 0; i <= 3; i++)
printf("array2[%d] = %d \t", i, array2[i]);
printf("\n");
for (i = 0; i <= 3; i++)
printf("array3[%d] = %d \t", i, array3[i]);
printf("\n");
for (i = 0; i <= 3; i++)
printf("array4[%d] = %d \t", i, array4[i]);
printf("\n");
}
/*
array1[0] = 10  array1[1] = 20  array1[2] = 30  array1[3] = 40  array2[0] = 10  array2[1] = 20  array2[2] = 30  array2[3] = 40
array3[0] = 10  array3[1] = 20  array3[2] = 0   array3[3] = 0
array4[0] = 0   array4[1] = 0   array4[2] = 0   array4[3] = 0
*/

// 1차원 배열 2
#include <stdio.h>
void main() {
//1차원배열 선언과 초기화
static int x[] = { 1, 2, 3, 4 };
static int y[] = { 10, 20, 30, 40 };
int i, z[4];
for (i = 0; i < 4; ++i)
z[i] = x[i] + y[3 - i];
printf("반대 위치의 배열요소 합\n");
for (i = 0; i < 4; ++i)
printf("%d + %d = %d\n", x[i], y[3 - i], z[i]);
}

다차원 배열
2차원 배열 선언
배열명 [행의 수][열의 수]
- int a[3][4]

2차원 배열의 선언과 초기화
int array[3][3] = {1. 2, 3, 4, 5, 6, 7, 8, 9};
총 9개의 데이터
int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}

2차원 배열의 기억공간 표현
3행 4열의 배열은 총 12개의 기억공간 확보
a[0][0]배열명은 배열전체의 시작주소
a[1][0]부분배열의 시작주소

/*2차원 배열의 사용 예*/
#include <stdio.h>
void main() {
static int score[4][3] = { {90,90,90},{80,80,80},{70,70,70},{60,60,60} };
int sum, i, j;
printf("번호\t국어\t수학\t영어\t합계\n");
for (i = 0; i < 4; ++i) {
sum = 0;
printf("%3d", i + 1);
for (j = 0; j < 3; j++) {
printf("\t%3d", score[i][j]);
sum += score[i][j];
}
printf("\t%3d\n", sum);
}
}

/*
번호    국어    수학    영어    합계
  1      90      90      90     270
  2      80      80      80     240
  3      70      70      70     210
  4      60      60      60     180
*/

3차원 배열 선언
자료형 배열명 [면의 수][행의 수][열의 수]

3차원 배열의 초기화와 기억공간 표현
int a [2][3][4] = {{{1,2,3,4},{5,6,7,8}{9,10,11,12}},
{{13,14,15,16},{17,18,19,20}.{21,22,23,24}}}

char형 배열
char 배열명[문자열 길이 + 1]
char str[12] // 12문자 길이를 가진 배열
char형 배열선언과 초기화
char name [] = "HONG GIL DONG"; //문자열 단위로 초기화
char address[] = {'S', 'E', 'O', 'U', 'L', '\0'}; 문자 단위로 초기화 '\0'을 삽입해야함 (null문자)

//char형 배열의 사용 예1
#include <stdio.h>
void main() {
char name[] = "HONG GIL DONG";
char adrs1[6] = { 'S','E','O','U','L','\0' };
char adrs2[6] = { 'S','E','O','U','L' };
printf("\n name: %s", name);
printf("\n adrs1 : %s", adrs1);
printf("\n adrs2 : %s", adrs2);
}
/*
 name: HONG GIL DONG
 adrs1 : SEOUL
 adrs2 : SEOUL => 다음 쓰레기 값이 붙을 수 있으므로 null문자 추가해야함
*/

#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
void main() {
char string[50];
int i = 0;
printf("문자열을 입력하세요:");
scanf("%s", string);
printf("입력 받은 문자열: %s\n", string);
printf("문자 단위 출력: ");
while (string[i] != '\0') { // 입력 문자는 자동으로 null문자 자동 삽입
printf("%c", string[i]);
i++;
}
}
/*
문자열을 입력하세요:대한민국만세
입력 받은 문자열: 대한민국만세
문자 단위 출력: 대한민국만세
*/

배열의 함수의 매개변수로 사용
-함수 호출 시 배열명만 명시하여 호출
함수의 헤더
-1차원 배열의 경우 크기 생략 가능
- 다차원 배열 경우 가장 높은 차원의 크기 생략 가능

//2차원 배열이 함수의 매개변수로 사용된 예
#include <stdio.h>
void score_sum(int gr[][5], int, int);
void main() {
int score[2][5] = { {10, 20, 30, 40, 50}, {10, 10, 10, 10, 10} };
score_sum(score, 2, 5);// 함수호출시 배열명만 명시
}
void score_sum(int gr[][5], int row, int column) {
//함수 헤더에 다차원 배열의 경우 가장 높은 차원의 크기는 생략 가능
int sum[2] = { 0 };
int i, j;
for (i = 0; i < row; i++) {
for(j = 0; j < column; j++)
sum[i] += gr[i][j];
printf("sum[%d] = %d \n", i, sum[i]);
}
}
/*
sum[0] = 150
sum[1] = 50
*/