본문 바로가기
Programming/C

10. 배열

by 기딩 2023. 10. 19.
728x90

배열 

한 번에 여러 개 값 저장할 수 있는 공간 받을 수 있음

  • 인덱스는 정수형, 할당하지 않은(벗어나는) 인덱스면 os가 죽임
  • 배열주소 = 배열 첫 인덱스 값 주소
  • ex int A[5]; → 주소 : 10, 14, 18, 22, 26.
    메모리 :  0a 00 00 00 14 00 00 00 …
  • 크기 선언 안 하면 [ ], 초기 선언 개수로 정해짐
  • 배열 선언 외 나머지 초기값은 0
  • 배열 초기화 안 하면 garbage
  • 서로 다른 배열은 원소 하나씩 비교해야 함

// a==b 이러면 서로 주소 비교됨.. 당연히 다름

#include <stdio.h>

int scores[] = { 1, 2, 3, 4, 5, 6 };
int i, size;

int main(void)
{
	size = sizeof(scores) / sizeof(scores[0]); //배열 원소 개수 자동 계산

	for (i = 0; i < size; i++)
		printf("%d", scores[i]);
	return 0;
}
  • 함수 매개변수로 받을 땐 함수(array[], x) 형식

배열과 함수

#include <stdio.h>
#define STUDENTS 5
int get_average(int scores[], int n);

int main(void)
{
	int scores[STUDENTS] = { 1, 2, 3, 4, 5 };
	int avg;

	avg = get_average(scores, STUDENTS); //배열이 인수면 주소호출
	printf("The average is %d.\\\\n", avg);
	return 0;
}

int get_average(int scores[], int n) //배열 원본이 scores[]로 전달
{
	int i;
	int sum = 0;

	for (i = 0; i < n; i++)
		sum += scores[i];
	return sum / n;
}

 

배열이 함수인 경우

  • 데이터 값을 불러오기엔 많으니 ex.영상 시작 주소만 가져와서 i.e 포인터로 핸들링
#include <stdio.h>
#define SIZE 7

void square_array(int a[], int size);
void print_array(int a[], int size);

int main(void)
{
    int list[SIZE] = { 1, 2, 3, 4, 5, 6, 7 };

    print_array(list, SIZE);
    square_array(list, SIZE); // 배열은 원본이 전달됨
    print_array(list, SIZE);

    return 0;
}

void square_array(int a[], int size) //배열 원본이 a[]로 전달
{
    int i;

    for (i = 0; i < size; i++)
        a[i] = a[i] * a[i];
}

void print_array(int a[], int size)
{
    int i;

    for (i = 0; i < size; i++)
        printf("%3d ", a[i]);
    printf("\\\\n");
}

2차원 배열

  • 보통 for루프 안에 for문
  • 이미지

학생들 성적 기록표 2차원 저장, 최종 성적 계산

#include <stdio.h>

int scores[3][5] = {
	{87, 98, 80, 76, 3},
	{99, 89, 90, 90, 0},
	{65, 68, 50, 49, 0}
};

//float last_scores[3];

int main(void)
{
	for (int i = 0; i < 3; i++) {
		double last_scores = scores[i][0] * 0.3 + scores[i][1] * 0.4 + scores[i][2] * 0.2 + scores[i][3] * 0.1 - scores[i][4] * 0.1;
		printf("학생 #%d의 최종성적 : %3.2f\\n", i+1, last_scores);
	}
	
	return 0;
}

영상 처리. 변환

#include <stdio.h>

void display(int image[8][16])
{
	for (int r = 0; r < 8; r++) {
		for (int c = 0; c < 16; c++) {
			if (image[r][c] == 0)
				printf("*");
			else
				printf("_");
		}
		printf("\\\\\\\\n");
	}
}

void inverse(int img[8][16])
{
	for (int r = 0; r < 8; r++) {
		for (int c = 0; c < 16; c++) {
			if (img[r][c] == 0)
				img[r][c] = 1;
			else
				img[r][c] = 0;
		}
	}
}

int main(void)
{
	int image[8][16] = {
		{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 },
		{ 1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1 },
		{ 1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1 },
		{ 1,1,1,0,0,0,1,1,0,0,1,1,1,1,1,1 },
		{ 1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1 },
		{ 1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1 },
		{ 1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1 },
		{ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 } };
	printf("Original Image\\\\\\\\n");
	display(image);
	inverse(image);
	printf("\\\\\\\\n\\\\\\\\nTransformed Image\\\\\\\\n");
	display(image);
	return 0;
}

728x90

'Programming > C' 카테고리의 다른 글

15. 스트림과 파일 입출력  (1) 2023.10.19
13. 구조체  (0) 2023.10.19
12. 문자열  (0) 2023.10.19
11. 포인터  (1) 2023.10.19
9. 함수와 변수  (0) 2023.10.19