사이먼's 코딩노트

[C언어] 배열 본문

C언어

[C언어] 배열

simonpark817 2024. 2. 8. 14:18

[배열]

  • 아래는 배열의 형태를 코드로 작성한 것이고 포인터와 유사한 점을 찾아봅시다.
#include <stdio.h>

int main(void) {
    
    int arr[2000];

    int arr1[3] = {1, 2, 3};

    int *p = arr1 + 1;

    printf("%d\n", p[0] + p[1]);

    return 0;
}
  • 위 코드와 같이 배열의 생김새는 [ ] 와 같다.
  • arr이라는 배열 공간에 총 int 타입의 2000개의 변수, 8000 바이트를 관리한다는 뜻이다.
  • arr은 포인터에서의 주소와도 같은 의미로써 한 공간에 메모리 크기가 무조건 8바이트 이다.
  • 포인터에서 * 가 해당 주소로 간다 라는 의미였다면 배열에서는 [ ] 가 그와 같은 의미가 담겨있다.

 

  • arr1변수와 같이 배열은 항상 배열 중 가장 첫번째 자리의 주소값을 가지고있다.
  • 배열의 공간 위치 순서는 int arr1[3]이라고 선언 되어있으면 실제로 arr1[0] 부터 시작해서 arr1[1], arr1[2] 까지 총 3개이다.
  • 그렇게 때문에 arr1 == &(arr1[0]) 이 성립이 되고, *arr1 == 1 이 성립이 된다.
  • 또한 다른 말로 *(arr1 + 1) == arr1[1] 도 성립이 된다.
  • 포인터 변수 p의 주소로 가면 해당 주소의 값이 arr1 + 1이 들어있고 arr1은 arr1[0]의 주소값이고 해당 주소값이 1을 더했으니 arr1[1]의 주소값이 된다.
  • 출력문을 출력해보면 p[0]에는 arr1[1]의 값이 있고 p[1]에는 arr1[2]의 값이 들어있기 때문에 2+3 = 5로 출력된다.

 

[문제]

  • 다음은 main 함수 안에있는 int 변수의 값들 중 최대값을 출력해보는 것이다.
  • 조건은 오직 변수 a만을 이용하는 것이다.
#include <stdio.h>

int main(void) {
    int a[10];

    // 배열의 값 세팅
    a[0] = -10;
    a[1] = 10;
    a[2] = 100;
    a[3] = 210;
    a[4] = 310;
    a[5] = 1440;
    a[6] = 1130;
    a[7] = 33210;
    a[8] = 1210;
    a[9] = 33210;

    // 반복문과 변수 a 사용 가능

    int max_number = 0;

    // 구현 시작
    for(int i = 0; i < 10; i++) {
        if(a[i] > max_number) {
            max_number = a[i];
        }
    }
    // 구현 끝


    printf("최대값은 %d 입니다.\n", max_number);

    return 0;
}
  • a라는 배열은 int 타입의 공간을 총 10개 가지고 있다.
  • a[0]부터 시작해서 a[9]까지 각각의 공간에 값을 세팅을 해줬고, 최대값을 나타내는 변수는 max_number 이다.
  • 반복문을 통해서 0부터 9까지 총 10번 반복을 하면서 max_number와 각 배열 공간에 들어있는 값을 비교한다.
  • 이 때 변수 a만을 이용해서 나타내기 위해 a[i]을 써준다.
  • a[i]과 같은 의미로는 *(a + i) 가 있다.

 

[문제 2]

  • 다음은 서술형으로 각 함수가 가지고 있는 크기에 대해서 설명하세요.
#include <stdio.h>

void sub1() {

}
void sub2() {
    int* arr;
}

void sub3() {
    int arr[4];
}

void sub4() {
    int arr1[4]; 
    int* arr2; 
}

int main(void) {
    sub1();
    sub2();
    sub3();
    sub4();

    return 0;
}

 

1. sub1 함수는 몇 바이트 짜리 함수인가요?

  • 지역변수도 없고 기능을 없는 함수이기 때문에 0바이트 짜리 함수이다.

 

2. sub2 함수는 몇 바이트 짜리 함수인가요?

  • arr은 포인터 변수이고 포인터 변수는 주소를 포함하기 때문에 무조건 8바이트이다.
  • sub2 함수에는 해당 포인터변수만 포함하기 때문에 8바이트 짜리 함수이다.

 

3. sub3 함수는 몇 바이트 짜리 함수인가요?

  • arr는 배열의 형태로 선언되었고, 배열은 주소값을 가지기 때문에 8바이트이다.
  • 게다가 배열 공간이 int 타입으로 총 4개가 존재하기 때문에 4x4 = 16바이트이다.
  • sub3 함수는 총 8+16 = 24 바이트 짜리 함수이다.

 

4. sub4 함수에서 arr1의 메모리 구조와 arr2의 메모리 구조를 비교해서 설명하세요.

  • arr1은 배열의 형태로 선언되었고 항상 가장 첫번재 배열의 주소값을 나타낸다. 따라서 arr1은 처음부터 공간을 가리키는 초기값이 존재한다.
  • arr2는 포인터 변수로서 8바이트의 크기를 가지고 있고 누구나 자유롭게 접근하고 가리킬 수 있어 초기값이 존재하지 않는다.

 

[문제 3]

  • 다음은 배열에 숫자 100개를 저장 후 저장된 각각의 숫자를 모두 출력해보는 것이다.
  • 조건은 배열 문법(예.arr[0]) 을 사용하지 않는 것이다.
#include <stdio.h>

int main() {

    int arr[100];

    for(int i = 0; i < 100; i++) {
        *(arr + i) = (i + 1);
        printf("%d\n", *(arr + i));
    }

    return 0;
}
  • 배열의 각각의 숫자를 넣기 위해서는 arr[0]부터 arr[99] 까지 차례대로 값을 넣어주면 되지만 이 문제의 조건은 배열 문법을 사용하지 않는 것이기 때문에 이와 같은 방법이 적용될 수 없다.
  • 선언된 arr 배열은 총 100개의 공간이 있고 arr은 배열의 시작점을 가르키는 포인터 변수이다.
  • 100개의 숫자를 일일이 넣어주기에는 효율성이 떨어지기 때문에 반복문을 통해 각 배열에 값을 넣어주고 출력까지 해주는 것이 효율적이다.
  • 반복문은 0부터 99까지 돌아가고, arr부터 arr+99까지 100개에 숫자를 넣어야 되기때문에 arr+i 부터 표시를 해준다.
  • 이 때 각 배열 주소에 값을 넣는 것이 아니기 때문에 *(arr + i) 와 같이 표현해야한다.
반응형

'C언어' 카테고리의 다른 글

[C언어] define / typedef / 문자 배열  (2) 2024.02.19
[C언어] scanf  (0) 2024.02.14
[C언어] 다중 포인터  (0) 2024.02.06
[C언어] 포인터 문제풀이  (0) 2024.02.02
[C언어] 포인터  (0) 2024.02.02