본문 바로가기

Datastructure/[3] 데이터구조

[3] 데이터구조 ① 배열

728x90
반응형

자료구조란?

  • 데이터 단위와 데이터 자체 사이의 물리적 또는 논리적 관계
  • 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저정하는 방법

배열

  • 같은 자료형의 변수로 이루워진 요소가 모여 직선 모양으로 줄지어 있는 자료구조.
  • 배열을 선언할 때 요소개수는 상수만 사용이 가능하다. (변수 사용시 동적할당을 이용한다.)
요소 배열의 해당 위치에 저장되있는 값
인덱스 요소의 위치 또는 배열의 개별 요소에 접근하기 위해 사용하는 값
배열 선언 : 자료형 배열 이름[요소 개수] 

 

예제: 배열의 요솟값 초기화

#include  <stdio.h>
#include  <string.h>
#include  <stdlib.h>
int main(){
    int num[5] = {1,2,3,4,5}// 배열 요소 (직접)초기화
    for(int i=0;i<5;i++){
    	printf("%d번째 숫자는 %d입니다.\n",i+1,num[i]);
    }
}

 

배열의 요소 개수 구하기

배열의 요소개수 개수 저장 변수 = sizeof(배열이름)/sizeoff(배열이름[0]);//배열의 요소 개수 구한 후 저장
#include  <stdio.h>
#include  <string.h>
#include  <stdlib.h>
int main(){
    int arr[100];//배열 선언
    
    int arr_num;//배열의 요소 개수 변수 선언
    arr_num = sizeof(arr)/sizeoff(arr[0]);//배열의 요소 개수 구한 후 저장
    //단 arr[]안의 인덱스는 배열의 크기보다 작거나 같아야 한다.
    
    printf("배열의 요소 개수는 %d입니다.",arr_num);
}

 

동적할당

malloc() 함수
해더
#include <stdio.h>
형식 void *malloc(size_t x)
해설 크기가 x인 메모리를 할당한다. 할당한 메모리의 값은 정의되지 않는다. 명시적 형변환이 필요하다.
반환값 메모리 할당에 성공 시 할당한 영역의 첫 번째 포인터 반환. 실패시 NULL포인터를 반환한다.
calloc() 함수
해더
#include <stdio.h>
형식 void *calloc(size_t x,size_t y)
해설 크기가 y인 자료가 x개만큼 들어갈 메모리를 할당한다. 할당한 메모리 영역은 모든 비트가 0으로 초기화된다. 
반환값 메모리 할당에 성공 시 할당한 영역의 첫 번째 포인터 반환. 실패시 NULL포인터를 반환한다.

(보통 내가 코딩할 때는 malloc함수를 자주 사용했다.)

free() 함수
해더
#include <stdio.h>
형식 void free(void *prt)
해설 prt가 가리키는 메모리 해제 후 다시 할당 가능하게함. 프로그램의 효율적인 공간 활용을 위해 메모리 할당 공간 사용 종료 시 해제하는 습관을 들이는 것이 중요함.
반환값 없음

+ C언어의 메모리 구조

데이터 영역 전역/정적 변수 할당
스택 영역 지역/매개 변수 할당
힙 영역 동적 메모리 할당

+변수의 종류

  지역변수 정적변수 전역변수
선언 위치 함수 내부 함수 외부
사용 범위 선언한 함수 내부에서만 사용가능 프로그램 내 전부 사용 가능
자동 초기화 사용자가 직접 초기화 0으로 자동 초기화
지속 시간 함수의 실행,종료에 따름 프로그램이 실행 될 동안 단 한번 생성, 프로그램 종료 시 소멸

 

예제: 동적할당(calloc)

#include  <stdio.h>
#include  <string.h>
#include  <stdlib.h>
int main(){
    int *arr,num;
    printf("원하는 자료의 개수를 입력하세요: "); scanf("%d",&num);
    arr = calloc(num,sizeof(int));
    if(arr == NULL) {printf("메모리 할당에 실패하였습니다."); return 0;}
    else{
        printf("> 입력한 자료의 개수에 자동으로 숫자가 대입되었습니다.\n");
        for(int i=0;i<num;i++) {
            arr[i] = i+1;
            printf("%d ",arr[i]);
        }
    }
}

1차원 배열 동적할당(정수형)

#include  <stdio.h>
#include  <string.h>
#include  <stdlib.h>
int main(){
    int *arr,num;
    printf("원하는 배열의 크기를 입력하세요: "); scanf("%d",&num);
    arr = (int*)malloc(num*sizeof(int));
}

2차원 배열 동적할당(정수형)

#include  <stdio.h>
#include  <string.h>
#include  <stdlib.h>
int main(){

    int N,M;//N개의 정수형 값 저장
    scanf("%d %d",&N,&M);

    int **num = NULL;
    num = (int **)malloc(N*sizeof(int *));
    //malloc의 sizeof에 포인터를 인자로 할 것!
    for(int i=0;i<M;i++) num[i] = (int *)malloc(M*sizeof(int));
    //2차원 배열을 위해 한번 더 동적할당 진행

    if( num == NULL){printf("Error");return -1;}//에러 확인

    for(int i=0;i<N;i++) 
        for(int j=0;j<M;j++) scanf("%d",&num[i][j]);
    for(int i=0;i<N;i++) 
        for(int j=0;j<M;j++) printf("Input[%d][%d]: %d\n",i+1,j+1,num[i][j]);

    for(int i=0;i<N;i++) free(num[i]);//1차원 배열 해제
    free(num);//포인터 연결 해제
}

예제: 배열 요소의 최댓값을 구하는 함수

#include  <stdio.h>
#include  <string.h>
#include  <stdlib.h>
int max_heigh(int *arr){
    int max = arr[0];
    for(int i=0;i<(int)sizeof(arr[0]);i++){
        if(arr[i]> max) max = arr[i];
    }
    return max;
}
int main(){
    int N,*arr;
    printf("사람 수를 입력하세요: ");scanf("%d",&N);
    arr = (int*)malloc(N*sizeof(int));
    printf("키를 입력하세요\n");

    for(int i=0;i<N;i++){printf("heigh[%d]: ",i+1);scanf("%d",&arr[i]);}
    printf("입력된 사람의 키 중 가장 큰 값은 %d입니다.",max_heigh(arr));
    
}
728x90
반응형
댓글