수업 일기장

수업 일기장 #배열

빅토리아레몬탄산수 2021. 1. 18. 13:56
#include <stdio.h> 

void PrintArr1DWithPtr(int* _pArr, int _len);
void PrintArr1DWithArr(int _arr[], int _len);


int main() {
	int arr2D[2][3] = {
		{ 11,12,13 },
		{ 21,22,23 }
	};

	for (int row = 0; row < 2; ++row) {
		for (int col = 0; col < 3; ++col) {
			printf("arr2D[%d][%d][%d]: %d (%p)\n", row, col, arr2D[row][col], &arr2D[row][col]);
		}
	}
	printf("arr2D: %p\n", arr2D);
	printf("arr2D[5]: %d (%p)\n", arr2D[5], &arr2D[5]);
	printf("arr2D[0][5]: %d (%p)\n", arr2D[0][5], &arr2D[0][5]);

	printf("\n");
	//////////////////////////////

	int ppArrLen = 2;
	int pArrLen = 3;
	// 담을 공간을 변수화 가능
	int** ppArr = (int*)malloc(sizeof(int*) * ppArrLen); // 1차원 포인터 두개를 담을 공간
	*(ppArr + 0) = (int)malloc(sizeof(int) * pArrLen); // 1차원 포인터의 시작 주소
	ppArr[1] = (int)malloc(sizeof(int) * 3); // 위와 같은 식임
	// 배열 메모리 해제는 할당 역순
	for (int row = 0; row < 2; ++row) {
		for (int col = 0; col < 3; ++col) {
			ppArr[row][col] = ((row + 1) * 10) + (col + 1);
			printf("*(*(ppArr + %d) +%d): %d (%p)\n",
				row, col, *(*(ppArr + row) + col),
				&(*(*(ppArr + row) + col)));
		}
	}
	printf("*(ppArr + 0): %p\n", *(ppArr + 0));
	printf("*(ppArr + 1): %p\n", *(ppArr + 1));

	//ppArr[0][5] = 100;
	//printf("ppArr[0][5]: %d (%p)\n", ppArr[0][5], &ppArr[0][5]);

	printf("\n");
	
	if (ppArr[0] != NULL) {
		free(ppArr[0]);
		ppArr[0] = NULL;
	}

	if (*ppArr [1] != NULL) {
		free(*ppArr[1]);
		*ppArr [1] = NULL;
	}
	if (*(ppArr + 0) != NULL) {
		free(*(ppArr + 0));
		*(ppArr + 0) = NULL;
	}


	//////////////////////////
	int* pArr1D = (int)malloc(sizeof(int) * 6);
	//연속된 6칸을 만듬
	int** pArr2D = (int*)malloc(sizeof(int*) * 2);
	pArr2D[0] = &pArr1D[0];
	*(pArr2D + 1) = pArr1D + 3;
	*(*(pArr2D + 1) + 2) = 1000;
	printf("*(*(pArr2D + 0) + 5: %d\n", *(*(pArr2D + 0) + 5));
	printf("pArr2D[0][5]: %d\n", pArr2D[0][5]);

	for (int row = 0; row < 2; ++row) {
		for (int col = 0; col < 3; ++col) {
			*(*(pArr2D + row) + col) =
				((row + 1) * 10) + (col + 1);
		}
	}

	PrintArr1DWithPtr(pArr1D, 6);
	PrintArr1DWithArr(pArr1D, 6);


	if (pArr2D != NULL) {
		free(pArr2D);
		pArr2D = NULL;
	}
	if (pArr1D != NULL) {
		free(pArr1D);
		pArr1D = NULL;
	}
	return 0;
}

void PrintArr1DWithPtr(int* _pArr, int _len) {
	// sizeof(arr) / sizeof(arr[0])
	for (int i = 0; i < _len; ++i) {
		printf("*(_pArr + %d): %d\n", i, *( _pArr + i));
	}
}

void PrintArr1DWithArr(int _arr[], int _len) {
	for (int i = 0; i < _len; ++i)
		printf("_arr[%d]: %d\n", i, _arr[i]);
}