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
반응형
'Datastructure > [3] 데이터구조' 카테고리의 다른 글
[3] 데이터구조 ③ 구조체 (1) | 2024.03.02 |
---|---|
[3] 데이터구조 ② 자료구조와 메모리 할당 (1) | 2024.03.01 |