1. void 포인터
: 타입이 정해져있지 않은 포인터
사용시 형변환 후 사용
2. 동적 배열
1) 동적할당(Dynamic allocation)
malloc(크기) : 리턴타입은 void*이다.
malloc(), 엠 얼로케이션, 말록이라고 불리움
헤더파일 <stdlib.h> 필요
3. 자료형* 포인터명 = (자료형*)malloc(sizeof(자료형)*칸수);
4. 칸 수에 변수 사용이 가능하다.
int* arData = (int*)malloc(sizeof(int)*length);
5. 동적 할당 clear(clear allocation)
: 모든 비트를 0으로 만들어준다(초기화랑 개념이 다름)
자료형* 포인터명 = (자료형*)calloc(칸수, sizeof(자료형));
6. 동적 할당 재설정(resize allocation)
자료형* 포인터명 = (자료형*)malloc(sizeof(자료형)*칸수);
포인터명 = (자료형*)realloc(포인터명, sizeof(자료형)*새로운 칸수);
7. 메모리 해제
: Heap메모리는 사용자가 직접 해제해야 한다.
해제하지 않으면 계속 남아있기 때문에 메모리가 낭비된다.
이를 메모리 누수라고 표현한다.
컴퓨터 재시작시 해결할 수 있다.
free(포인터명);
8. 오늘 실습코드
1) pointerTask.c
#include<stdio.h>
#define L 5
//5개의 정수를 전달받아 최대값과 최소값 구하는 void형 함수
void getMaxAndMin(int arData[], int* PMax, int* PMin) {
*PMax = arData[0];
*PMin = arData[0];
for (int i = 0; i < L; i++) {
if (*PMax < arData[i]) {
*PMax = arData[i];
}
if (*PMin > arData[i]) {
*PMin = arData[i];
}
}
}
void main() {
int max = 0;
int min = 0;
int arData[L] = { 0, };
printf("5개의 정수 입력\n");
for (int i = 0; i < L; i++) {
printf("%d번째 : ", i+1);
scanf_s("%d", arData + i);
}
getMaxAndMin(arData, &max, &min);
printf("최대값 : %d\n", max);
printf("최소값 : %d\n", min);
}
2) voidPointer.c
#include<stdio.h>
void main() {
int data1 = 10;
double data2 = 20.56;
char data3 = 'A';
void* arData[] = { &data1, &data2, &data3 };
printf("%d\n", *(int*)arData[0]);
//int* pData1 = &data1;
//double* pData2 = &data2;
//char* pData3 = &data3;
}
3) dArTest.c
#include<stdio.h>
#include<stdlib.h>
void main() {
//동적 배열 할당
int* dAr = (int*)malloc(sizeof(int) * 5);
//동적 할당 재설정
dAr = (int*)realloc(dAr, sizeof(int) * 6);
//메모리 할당 해제
free(dAr);
//동적 할당 clear(clear allocation)
dAr = calloc(6, sizeof(int));
//dAr 값 출력
for (int i = 0; i < 6; i++) {
printf("%d\n", dAr[i]);
}
//메모리 할당 해제
free(dAr);
}
4) dArTest2.c
#include<stdio.h>
#include<stdlib.h>
void main() {
//정수 개수를 입력받고 그 만큼 배열 할당하기
int cnt = 0;
int* dArNum = 0;
printf("입력할 정수 개수 : ");
scanf_s("%d", &cnt);
dArNum = (int*)malloc(sizeof(int) * cnt);
for (int i = 0; i < cnt; i++) {
printf("%d번째 정수 : ", i + 1);
scanf_s("%d", dArNum + i);
}
for (int i = 0; i < cnt; i++) {
printf("%d ", dArNum[i]);
}
printf("\n");
free(dArNum);
}
5) dArTask.c
#include<stdio.h>
#include<stdlib.h>
void sortASC(int arData[], int length);
void sortDESC(int arData[], int length);
void main() {
//정수 개수 입력받고 그 만큼 할당하기
//입력받은 정수로 오름차순(void 함수) 또는 내림차순(void 함수) 선택 후 결과 출력
//1.오름차순\n2.내림차순\n3.나가기
int* dArNum = 0;
int length = 0;
printf("입력하실 정수개수 : ");
scanf_s("%d", &length);
dArNum = (int*)malloc(sizeof(int) * length);
for (int i = 0; i < length; i++) {
printf("%d번째 정수 : ", i + 1);
scanf_s("%d", dArNum + i);
}
sortASC(dArNum, length);
sortDESC(dArNum, length);
}
void sortASC(int arData[], int length) {
int temp = 0;
for (int i = 0; i < length-1; i++) {
for (int j = i + 1; j < length; j++) {
if (arData[i] > arData[j]) {
temp = arData[i];
arData[i] = arData[j];
arData[j] = temp;
}
}
}
}
void sortDESC(int arData[], int length) {
int temp = 0;
for (int i = 0; i < length - 1; i++) {
for (int j = i + 1; j < length; j++) {
if (arData[i] < arData[j]) {
temp = arData[i];
arData[i] = arData[j];
arData[j] = temp;
}
}
}
}
'웹_프론트_백엔드 > 단과' 카테고리의 다른 글
[단과_C] 2020.03.23 (0) | 2020.03.23 |
---|---|
[단과_C] 2020.03.20 (0) | 2020.03.22 |
[단과_C] 2020.03.18 (0) | 2020.03.18 |
[단과_C] 2020.03.17 (0) | 2020.03.18 |
[단과_C] 2020.03.16 (0) | 2020.03.17 |