드디어 완강이다!
마지막 수업!!!
*추가) malloc은 기본적으로 void 형으로 할당 되어지기 때문에 내가 원하는 형으로 변환 시켜주는 겁니다. float이 필요하면 (float *)로 해주고 int가 필요하면 (int *)로 형 변환 시켜주는겁니다. 이렇게 형변환을 안해주면 컴퓨터 입장에서는 무슨 형으로 쓸 지 모르기 때문입니다.
-> 그래서 형변환을 앞에 무조건 써야한다! 밑에 예제도 보면 int**로 형변환했다!
ㅎㅎ 구조체 동적 메모리 할당을 포인터 변수로 선언하면
보통 p.number 이런식으로 가능했는데 p->number 이렇게 가능해진다.
그래서 메모리 공간에 struct Book 2개 공간만큼 선언하고
주소 2개에 1,2번 다 할당하고
showBook 함수로 출력하게끔 나타냈다.
와 근데 보면 볼수록 이거를 어떻게 짯을까 이 생각이 많이 든다. 엄청 신기함
메모리 공간에 저거를 넣고!! 출력은 함수를 또 만들어서 i 루프 돌게끔 해서 0,1 나오게끔
하고 출력을 한다라.. 대단한 것 같다. 당연히 free(p)로 반환하고!
대망의 마지막 문제!!
이거는 동적 메모리 할당 2차원 배열이다!
우선 int** pptr = (int**)malloc(sizeof(int*) * 8); 이 부분은
int*형 포인터에 대한 메모리 공간을 8개 생성하겠다는 의미다.
그러니까 네모 박스 8개가 있는데, 이 네모 박스 하나당 어떠한 데이터를 가리키는 포인터 역할을 한다.
그래서 이 네모 박스가 뭘 가리키는지 써야해서
*(pptr + i) = (int *)malloc(sizeof(int) * 6 ); 를 썻다.
*(pptr + i)는 네모 박스 하나당 6개 공간을 가진다는걸 알 수 있다.
쉽게 말하자면 **pptr X 8 개 각각 한 개당 안에 *pptr 6개가 있다는 소리!! (그러니 총 48개의 int형 변수를 저장할 2차원 배열을 만든 것이다)
그래서 for문 돌때도 y안에 x 넣고 돌린다.
이해가 약간 안가는 부분은 *(*(pptr +y) + x ) = 6 * y + x; 이 부분이긴 한데
아마 내 생각에는 x가 네모 박스 하나가 가리키는 공간들이니 (6개) for문을 돌리면
*(*(pptr+0)+0)= 6*0 + 0
*(*(pptr+0)+1)= 6*0 + 1
*(*(pptr+0)+2)= 6*0 + 2
이런식으로 간단말이지..
그러면 즉 *(*(pptr)) = 0 , *(*(pptr)+1) = 1 , *(*(pptr)+2) = 2 ... 5이렇게 된다.
그리고 y가 1로 갔을때는
*(*(pptr+1)+0) = 6*1 + 0
*(*(pptr+1)+1) = 6*1 + 1
즉 , *(*(pptr+1)+0) = 6 , *(*(pptr+1)+1) = 7 이렇게 된다.
아 .. 이렇게 쓰니까 이해가 갔다
처음 네모박스가 가리키는거는 0~5이고 , 두 번째 네모박스는 6~11이 된다.
하긴 그것도 그런게 값은 1차원 배열의 값을 지금 나타내고 있는거니까.
그래서 *(*(pptr + y) + x ) = 6 * y + x; 라는 수식을 썻구나!
캬... 순서대로 0부터 47까지 나타내기 위한.. 엄청나다
밑에 for문에서 %3d는 3만큼 공백을 입력한다는 것이다.
그리고 당연히 위에서 저렇게 다 메모리에 할당시켜줬으니
출력하면 저장된 값들이 나온다.
그리고 free() 로 반환 무조건 하는데 이거는 바깥에서 하나씩 해도 된다고 하셨다.
그래서 for문으로 y 돌리고 0~7
그 후에 free(*(pptr+ y)); 했다.
그래서 반환 정상적으로 되고
짜자잔~ 완성!!
크 이 부분은 C++ 메모리 부분과 연동이 되는 만큼 더 깊게 알아야겠다.
물론 C++은 더 간결하게 나타나긴 하겠지만!
끄읕!!
'C언어' 카테고리의 다른 글
C언어 동적 메모리 할당 (0) | 2022.07.18 |
---|---|
C언어 구조체의 활용(2) (0) | 2022.07.18 |
C언어 구조체 (0) | 2022.07.18 |
C언어 문자열 (0) | 2022.07.18 |
C언어 포인터 (0) | 2022.07.18 |