본문 바로가기
2022-2/자료구조

배열과 구조체, 공용체, 순서리스트

by 철없는민물장어 2022. 9. 21.
728x90
반응형

배열

첨자(index)와 값(value)의 쌍들의 집합.

int list[5];

int *plist[5];

 

list[0]의 주소 = a라고 가정

list[1]의 주소 = a + sizeof(int)

배열을 인자로 전달 시 배열의 시작주소가 복사됨. (Call by reference)

 

배열의 동적 할당.

int *A = (int*) malloc(sizeof(int)*100);

int *B = (int*) calloc(100,sizeof(int));

같은 동적할당이지만 malloc은 쓰레기값이 들어있고 calloc은 0으로 초기화된다

 

A = (int*) realloc(A,sizeof(int)*200); 

용량을 늘리고싶어 재할당을 했다.

이때 메모리상에 원래크기의 배열A 뒷부분에 공간이 없다면..?

새로 할당할 크기만큼의 자리를 찾아 그 공간으로 배열을 모두 복사해서 넘겨야 한다.

이 과정에서 시간이 많이 걸릴 수 있으니 웬만하면 처음부터 넉넉하게 할당받자.

 

이차원배열의 경우(A[10][20])

int **A=(int**) malloc(블라블라)

우선 주소를 저장할 10칸짜리 배열이 먼저 만들어지고..

각각의 칸에 각각 20칸짜리 배열의 주소가 적혀져있게된다

 


구조체

배열이 한 가지 자료형의 모음이었다면 구조체는 다양한 자료형을 포함함.

struct humanBeing{
	char name[10];
    int age;
    double salary;
};
typedef struct humanBeing human_being;

구조체 A, B가 있다고 하자

B에다가 A의 내용을 그대로 넣고싶은데

B=A;를 했을때 동작할까?

동작 한다.

구조체는 통째로 복사가 된다.

 

구조체를 인자로 받는 함수 작성 시

예를들어 f(human_being A, human_being B)라는 함수가 있다고 하자.

이 때 구조체A, B가 각각 복사되어 전달되기 때문에 메모리낭비가 생긴다.

구조체를 인자로 받을 때는 주소를 전달하는 것이 효과적이다.

 

구조체 비교시

A와 B의 모든 속성들이 같은지 비교하고싶을 때

if(A==B)이런건 안되니까 주의하자.

그 대신 memcmp라는 함수를 사용하면 된다.

memcmp(&A,&B,sizeof(human_being));

 

자기 참조 구조체: 구조체의 속성 중 하나가 스스로를 가리키는 구조체.

struct list{
	char data;
    struct list *link;
};

대략 이런 모양새.

연결 리스트 구현 할 때 많이 사용된다.

 


Union

union의 필드들은 메모리를 공유한다.

멤버변수 중 가장 메모리 할당량이 큰 변수 만큼의 메모리공간만 할당한다

struct human{
	enum {female,male} gender;
    union{
    	int children;
        int beard;}u;
 };

이걸로 예를 들면..

보통의 경우 female은 childeren과 관련있고 male은 beard와 관련있기 때문에,

한 사람이 children,beard 둘 다 값을 가질 필요는 없다.

이런경우에 사용하면 알맞을 것 같다..

근데.. 어라라

children에도 값을 넣고 beard에도 값을 넣으면..?어떻게되는겨?

값이 덮어씌워지고 사라진대나 뭐래나

 

C언어에서 union필드들이 적절하게 사용됐는지 검사해주지 않기때문에 주의를 해야한다.

 

 


순서 리스트

데이터들의 순서가 유지되는 집합이다.

예를 들면 한 주의 요일들(월화수목금토일) 뭐 이런게 있겠다.

순서리스트는 배열에 저장하면..편할것같네.

 

어라라? 

그러고보니 순서리스트vs연결리스트 비교가 하고싶어진다.

 

리스트에서 i번째 데이터를 검색, 대체하는건 뭐가 빠를까?

배열로 쓰면 A[i]=8; 뭐 이런식으로 단번에 바꿀 수 있겠지만

연결리스트의 경우 i번만큼 p->next로 이동해야해서 정말 힘들것같다.

 

그렇다면, 리스트에서 i번째 위치에 새로운 데이터를 추가하는 경우는 어떨까?

배열은.. i번째 리스트에 값을 추가하면 그 뒤에있던 데이터가 싹 다 한칸씩 밀리면서.. 뒤에있는걸 다 수정해야한다

연결리스트의 경우 주소 연결만 시켜주면 되기 때문에 단번에 가능하다

 

728x90
반응형

댓글