자료구조

[자료구조] 06 배열 Array

juju824 2020. 9. 21. 00:05

✔️ 배열(array)

가장 많이 사용되는 자료구조 중 하나, 자료형이 동일한 원소 (element)들의 유한 집합 

 

👉배열은 연속적인 메모리 상에서 표현, 각 원소의 값은 고유의 인덱스(index)로 접근 

1차원,2차원...다차원 배열까지 

 

👉C언어의 경우는 배열의 인덱스 0부터 시작!

배열은 선언 된 이후 배열의 크기 (원소의 수) 변경할 수 없으므로 원소의 수를 잘 예측해야 공간 부족, 메모리 낭비 예방 

 

 

 

✔️ 배열의 선언

원소의 자료형 + 배열 이름 + 배열의 크기 순서로 선언 

❗️A의 원소수가 n개라면 배열 인덱스 범위는 [0...n-1]까지 (0부터 시작하니까!)

int A[5]; //정수형 배열
int *ptr[5]; //정수 포인터형 배열
int B[2][3]; //2행 3열 정수형 배열

 

 

ex) int juju[5]; 의 배열이라면 👇

메모리 주소 배열 원소
100000 juju[0]
100004 juju[1]
100008 juju[2]
100012 juju[3]
100016 juju[4]

정수형 배열 원소 하나에 4바이트를 할당 

 

 

 

👉 juju[0] : 배열의 첫 번째 원소의 주소는 시작 주소 : Base Address 라 부른다

ex) int juju[5];

배열의 이름 juju는 시작 주소를 값으로 갖고 있는 포인터 상수 (pointer constant)

=> 선언에 사용된 이름은 이후 다른 값(주소) 가질 수 없다

반면,

int * juju2;

새로운 값을 자유롭게 저장 가능한 포인터 변수 

 

 

💢헷갈리지 말자

juju == &juju[0]     // juju라는 배열 이름은 시작 주소를 갖고 있는 것

*juju == juju[0]     // *juju는 juju 시작 주소가 갖고 있는 값을 참조하는 것 => 헷갈리지 말자

 

#define ARRAY_SIZE 100
int num[ARRAY_SIZE], result;
int arraysum(int num[], int n);

void main(void){
    int i;
    for(i=0; i<ARRAY_SIZE; i++){
        num[i] = i;
    }
    result = arraySum(num, ARRAY_SIZE);
    printf("Sum : %i\n", result);
}

int arraySum(int num[], int n){
    int i, temp = 0;
    for(i=0; i<n; i++){
        temp+=num[i];
    }
    return temp;
}
//결과 : Sum : 4950

👆위와 같이 함수에 배열을 전달해서 배열 원소의 합계를 전달할 수 있다

 

 

 

 

✔️ 배열의 선언과 초기화

 

 

👉int juju[] = {1,2,3,4,5};

배열의 크기를 따로 지정안해주어도 원소들 초기화하는걸로 배열의 크기 5로 지정해줄 수 있다

#include <stdio.h>
void printArray(int *ptr, int size);


void main(){
    int num[10] = {0,1,2,3,4,5,6,7,8,9};
    printArray(num,10);
}

void printArray(int *ptr, int size){
    int i;
    for (i=0; i<size; i++){
        printf("%8u %5d\t", ptr+i, *(ptr+i)); //*(ptr+i) 메모리 주소가 참조하고 있는 '값'
        printf("%8u %5d\n", &ptr[i], (ptr[i])); //&을 붙이면 '메모리 주소', 없으면 그 배열의 '값'
    }
}
//결과
4016175088     0	4016175088     0
4016175092     1	4016175092     1
4016175096     2	4016175096     2
4016175100     3	4016175100     3
4016175104     4	4016175104     4
4016175108     5	4016175108     5
4016175112     6	4016175112     6
4016175116     7	4016175116     7
4016175120     8	4016175120     8
4016175124     9	4016175124     9

주소값이 4바이트씩 추가가 되고 있다

만약 int 가 아닌 배열이 double이었다면 8바이트씩 할당 

 

'자료구조' 카테고리의 다른 글

[자료구조] 08 재귀호출  (0) 2020.09.21
[자료구조] 07 구조체,배열 이용한 볼링게임  (0) 2020.09.21
[자료구조] 05 💫 포인터  (0) 2020.09.17
[자료구조] 04 구조체란?  (0) 2020.09.17
[자료구조] 03 자료형  (0) 2020.09.17