[자료구조] 배열과 구조

LEESEUNGYEOL·2022년 1월 5일
0


배열과 구조에 대해서 공부하고 더 나아가서 생각해 볼 수 있는 여러 알고리즘들에 대해 공부해 보겠습니다.

배열(arrays)

  • 같은 타입의 데이터의 모임
  • 연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조
  • 동일한 자료 유형이 여러 개 필요한 경우 이용할 수 있는 자료 구조

배열의 표현

다음 코드와 같이 표현할 수 있습니다.

int a[] = {10, 30, 40, 50};
int b[4] = {1, 3};
int c[3];
char ch[] = "abcd"; 
sizeof(a) = 4;
sizeof(b) = 5;
  • 값을 할당하지 않고 선언할 경우 반드시 배열의 크기를 명시해 주어야합니다.
  • 문자열의 경우 끝에 /0가 있기 때문에 크기가 1 더 큰 것을 주의해야 합니다.

배열과 포인터 그리고 주소

  • 배열의 선언의 경우 컴파일러는 연속적인 메모리 장소를 할당합니다.
  • 실제 C에서는 list[i]라고 쓰면 C언어는 이것을 주소가 list[i]인 정수에 대한 포인터로 해석합니다.
int* list;
*list = list[0]; 
*(list + i) == list[i];

배열의 주소값은 배열의 0번째 인덱스의 주소값과 같습니다.

call by reference, value

배열이 함수의 매개변수로 사용될 때, C에서 이를 처리하는 방식에 대해 고민해 보면 유용합니다.

C언어의 함수의 모든 매개변수는 함수 내에서 선언되어야 합니다.
그러나 배열에 대해서는 새로운 저장 공간이 함수 내에 할당되는 것이 아니라 메인 프로그램에서만 정의됩니다.

따라서 C언어에서는 매개변수 전달 방식이 값에 의한 호출(call-by-reference)임에도 불구하고 주소값이 바뀌기 때문에 배열 매개변수가 그 값들을 변경하게 만듭니다.

memory dinamic allocation

일반적인 변수의 선언과 사용은 정적(staic)으로 사용합니다.
하지만 메모리 사용 예측이 부정확한 경우는 충분한 메모리를 미리 확보해야 하기 때문에 비효율적일 수 있습니다.

동적 메모리 할당에는 malloc(), realloc(), calloc()을 사용할 수 있습니다.

int* arr;
arr = (int*)malloc(sizeof(int) * n);
free(arr)
  • 함수 malloc()이 반환하는 값은 포인터인 int *의 변수로 저장하고,
  • malloc()의 인자는 sizeof(int) * (확보하려는 배열의 원소의 개수)로 지정
  • 메모리 공간이 성공적으로 확보되면 변수를 사용하여 배열에 이용합니다.
  • 프로그램이 종료되기 전에 필요없으면 메모리를 해제해 주어야 합니다.

구조체(structures)

  • 서로 다른 여러가지 타입을 그룹화하는 방법
  • 각각의 항목은 타입과 이름으로 식별됩니다.

구조체의 표현

struct{
	char name[10];
    int age;
    float salary;
    }person;

위 구조체는 이름이 person이고 다음 3개의 필드를 갖는 변수를 생성합니다.

  • 문자 배열로 된 이름(name)
  • person의 나이(age)를 나타내는 정수 값
  • 각 개인의 월급(salary)을 나타내는 실수 값

다음과 같이 typedef 명령문을 사용하여 구조 데이터 타입을 생성할 수 있습니다.

typedef struct{
	char name[10];
    int age;
    float salary;
    }person;

person은 구조의 정의를 통해 정의된 타입이름이며 다음과 같이 변수를 선언할 수 있습니다.

person p1, p2;

구조 속에 또 다른 구조를 정의하여 사용할 수도 있습니다.

typedef struct{
	int month;
	int day;
	int year;
} date

typedef struct{
	char name[10];
    int age;
    float salary;
    date birth;
}person;
    

당연히 c는 컴파일하는 과정이 위에서 아래이므로 이러한 구조를 사용할 시 포함되는 구조를 위에 선언해줘야 합니다.

☠ 주의

  • 구조체는 equlity check가 불가능 합니다.
  • 각각의 내부 타입으로 접근해서 equlity check를 해야 합니다.
  • assign은 가능합니다.
if(person1 == person2) //불가능
p1 = p2; //가능

self-Referential Structure(자기 참조 구조체)

  • self reference는 구성 요소 중에 자기 자신을 가리키는 포인터가 1개 이상 존재하는 구조를 말합니다.
typedef struct{
	char data;
    struct list* link; //자기 자신을 포인팅 
}list;
  • self reference는 list란 data type에 저장된 어떤 공간을 포인팅할 수 있습니다.
  • linked-list 자료구조에 자주 사용됩니다.👍

2개의 댓글

comment-user-thumbnail
2022년 1월 6일

몇몇 부정확한 정보들이 있네요.. 참고용으로 읽으시면 좋을 것 같습니다!

1개의 답글