수업 일기장
수업 일기장 #배열
빅토리아레몬탄산수
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]);
}