웹_프론트_백엔드/단과

[단과_C] 2020.03.19

shine94 2020. 3. 20. 01:30

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